ROM簡單製作教程

poclist發表於2016-09-17
1.安卓基礎知識普及:


Android一詞的本義指“機器人”,同時也是Google於2007年11月5日宣佈的基於Linux平臺的開源手機作業系統的名稱,該平臺由作業系統、中介軟體、使用者介面和應用軟體組成,號稱是首個為移動終端打造的真正開放和完整的移動軟體。目前,最新版本為Android 2.4Gingerbread和Android 3.0Honeycomb。

①底包
:官方的系統包,相當於我們的Windows的作業系統,事實上它相當於一個純淨版或者核心版的系統包,是最底層的東西。副檔名為sbf,底包通常是官方釋出的,ROM作者直接拿來用的,可以選擇的版本不會太多,通常更新也不會頻繁。底包通常使用PC端刷機工具(RSD)配合Bootloader的工程模式完成刷入。

②升級包
(映象包):廣大玩家制作的底包增強包,通常表現為一個update.zip檔案。升級包是對底包的擴充套件和增強,包含一系列的輔助工具和服務,沒有中文的底包通過升級包可以實現中文。當然,很多功能也是通過升級包來實現的。可以說,在重新整理了底包後,配合重新整理相應的升級包,這樣才形成一個完整系統。升級包通常通過Recovery工具,從SD卡讀取刷入。

③Bootloader :相當於電腦裡面的bios(基本輸入輸出系統),手機一開機,控制手機的就是Bootloader。我們通常所說的進入Bootloader,實際上是指進入Bootloader的工程模式,既是刷機模式,在此模式下可以將moto的sbf檔案(底包)刷到機器裡面。

④Recovery : Moto 手機內建的一個獨立備份恢復工具,類似電腦上的一些一鍵還原系統,既是在系統出現問題的時候仍然可以開啟的一個模式。Moto 的 Recovery 主要提供了WIPE(硬啟,清除資料,恢復出廠設定)和Update(通常用於安裝升級包,update.zip)功能。 Recovery是不能直接重新整理的底包的,通常它重新整理的升級包(update.zip)的方式是:自動尋找SD卡上的特定檔案,然後寫入。

⑤基帶(Baseband):是手機中的一塊專門的程式碼,或者可以理解成為一個專門負責通訊的BIOS,負責完成移**絡中無線訊號的解調、解擾、解擴和解碼工作。基帶的不同會造成訊號效果的不同。因為各地、各網路實際情況不同,需要大家自己選擇適合自己的基帶。

⑥WIPE :wipe後就恢復了出廠設定,包括聯絡人、簡訊、安裝的軟體等全部刪除。俗稱硬啟,恢復出廠設定。注意,wipe後app2sd和root許可權需要重新做。而且app2sd重要的分割槽步驟也要重新來過。某些說法提到在重新整理底包或者升級包前需要進行WIPE操作,我對此操作的必要性不是很確定。

⑦OpenRecovery(簡稱OR) :由於MOTO很蛋疼的在update.zip上做了一些手腳,這些東西影響到了升級包的製作。於是高手們就搞出了一個OpenRecovery,這其實就一個第三方的增強版的Recovery工具,某些OpenRecovery已經發展成為一個具有很多功能的小系統了(類似WindowsPE),在這個OR中,可以完成很多東西,我們完全可以把OR想象成電腦上用的應急PE系統,在上面可以調整超頻、基帶、app2sd、更換啟動畫面、wipe、改變時區、調整鍵盤佈局,甚至連結USB當讀卡器等等,凡是recovery能做的,OR都可以做,recovery不能做到,OR可以做到。一般OpenRecovery在sd卡上有兩個部分存在:update.zip和OpenRecovery目錄,最新的GOT底包新增了新的一個OpenRecovery-CFG目錄,用來存放各種個人檔案。update.zip就是用來坑MOTO一個標準的的zip升級包,而真正的升級包要放在/sdcard/OpenRecovery/updates目錄下。

⑧App2sd :說白了,其實很簡單,就是把APK檔案安裝到sd卡上,android是Linux脫胎而來,App2sd的原理就是對SD卡進行分割槽,然後把SD上劃分出來的某個分割槽合併到系統分割槽中去(聽不懂,不要緊),劃分出來的分割槽是Ext2格式,一般Windows不能識別,不要驚慌,正常現象。App2sd對sd卡要求比較高,如果感覺app2sd後比較慢,可以試試換一張C4的sd卡。因為在2.1的環境下,app2sd需要對sd進行分割槽,操作比較複雜,E文不好的小白或者電腦基礎薄弱的小白容易失誤。建議對Android非常熟悉了再做App2sd。

⑨Root :大家都知道android系統脫胎自Linux,也正是這個開源的核心讓廣大玩家可以自由發揮。Root是Linux系統下的系統級賬號,擁有系統的全部許可權,Android設計上的不開放這個使用者的,目的是為了保護系統安全,但是這個保護似乎也帶來很多不便。於是就一些工具和方法來開放這個賬號。開放Root賬號的方法似乎有很多,這裡就不再細說。原理上分析,root的賬號,應該通過在Android系統安裝某個系統級別的服務,該服務具有root許可權,然後其它需要root許可權的程式再向這個服務請求root許可權。WIPE、刷機都有可能會造成root許可權失效,需要重新root許可權。

額外說明:

①從原理上分析,通常底包,Bootloader,Recovery,基帶都是可以重新整理替換的,升級包當然更可以。但是底包、Bootloader很少會有第三方開發或者修改的,一般都使用官方釋出的。底包有時候會內建Bootloader、Recovery,這樣的底包重新整理時會連上述兩者一起更新(推測結果,不確定)。更新這樣的底包是有危險的,有可能會造成Bootloader損壞,這個東西損壞了,基本就是變磚了,真正的變磚,只能花錢去修了。只有這個東西沒壞,就不是磚。②
我們通常所說的刷機ROM實際是升級包,升級包是對應於特定的底包製作的,所以刷機時務必確保使用的底包和升級包版本上保持一致。③
需要注意版本號的還有:Bootloader版本、基帶版本、Recovery版本④
目前有些OpenRecovery工具支援底包、升級包一起從SD卡讀取刷入⑤
似乎刷機前確保系統乾淨整潔是很重要的,很多教程提到要通過 WIPE - 刷底包的步驟來確保刷機前的乾淨,實際上如果底包版本沒有變化,刷底包似乎、也許、大概、可能是不必要的。


2.系統結構及檔案簡單剖析:

一個常見的自制ROM根目錄會有以下幾個資料夾及檔案:
data,META-IN,system,boot.img(鎖了BL的可以無視這個,但製作時需要它,打包時把它拿出來。)
系統目錄說明
①應用程式安裝目錄
1) 系統應用程式所在目錄/system/app/*.apk
2)使用者安裝應用程式所在目錄/data/app/*.apk
3) 注意:a)在模擬器中,每重啟一次,/system/app/下的應用都會被還原,有時/data/app下也會被清除
b)若在/system/app和/data/app下有重名的應用,不一定會啟動哪一個,尤其是在adb install殺死正在執行的程式時,有時舊的就會被啟動
②.使用者資料所在目錄
/data/data/應用包名/shared_prefs配置檔案
/data/data/應用包名/databases/*庫檔案所在目錄
③. SD卡對應目錄/sdcard/
而我們需要處理的只是兩個資料夾裡面的內容:
data/app ——該資料夾裡的檔案可以全刪,也可以自由新增自已所需安裝的應用軟體,刷機安裝後可以自由刪除。
system/app ——在這個資料夾下的程式為系統預設的元件,可以看到都是以APK格式結尾的檔案,但有些系統自帶的ROM裡面還有和APK檔名對應的odex檔案。我們主要是針對該資料夾裡的檔案進行精簡,如果有odex檔案的,刪除APK檔名時同時也刪除與其對應的odex檔案。雖然一般定製時只是對以上兩個資料夾裡的檔案做相應的增減,但我們還是一起來了解system相應目錄常見相應檔案的用途吧。rom版本不同,裡面的APK也會不一樣,其它資料夾下需要改動的較少,或者不需要改動。但app檔案下是製作時的重點,所以詳細列出:
\\system\\app
\\system\\app\\AlarmClock.apk
鬧鐘
\\system\\app\\Browser.apk
瀏覽器
\\system\\app\\Bugreport.apk Bug報告
\\system\\app\\Calculator.apk
計算器
\system\app\Calendar.apk
日曆
\\system\\app\\CalendarProvider.apk
日曆提供
\\system\\app\\Camera.apk
照相機
\\system\\app\\Contacts.apk
聯絡人
\\system\\app\\DownloadProvider.apk
下載提供
\\system\\app\\DrmProvider.apk DRM數字版權提供
\\system\\app\\Email.apk
電子郵件客戶端
\\system\\app\\FieldTest.apk
測試程式
\\system\\app\\GDataFeedsProvider.apk GoogleData提供
\\system\\app\\Gmail.apk Gmail電子郵件
\\system\\app\\GmailProvider.apk Gmail提供
\\system\\app\\GoogleApps.apk
谷歌程式包
\\system\\app\\GoogleSearch.apk
搜尋工具
\\system\\app\\gtalkservice.apk GTalk服務
\\system\\app\\HTMLViewer.apk HTML檢視器
\\system\\app\\Htc**.apk
整合**客戶端PEEP
\\system\\app\\IM.apk
即使通訊元件包含MSN、yahoo通
\\system\\app\\Launcher.apk
啟動載入器
\\system\\app\\Maps.apk
電子地圖
\\system\\app\\MediaProvider.apk
多媒體播放提供
\\system\\app\\Mms.apk
簡訊、彩信
\\system\\app\\Music.apk
音樂播放器
\\system\\app\\PackageInstaller.apk apk安裝程式
\\system\\app\\Phone.apk
電話撥號器
\\system\\app\\Settings.apk
系統設定
\\system\\app\\SettingsProvider.apk
設定提供
\\system\\app\\SetupWizard.apk
設定嚮導
\\system\\app\\SoundRecorder.apk
錄音工具
\\system\\app\\Street.apk
街景地圖
\\system\\app\\Sync.apk
同步程式
\\system\\app\\Talk.apk
語音程式
\\system\\app\\TelephonyProvider.apk
電話提供
\\system\\app\\Updater.apk
更新程式
\\system\\app\\***Services.apk ***服務
\\system\\app\\Vending.apk
製造商資訊
\\system\\app\\VoiceDialer.apk
語音撥號器
\\system\\app\\VoiceSearch.apk
語音搜尋
app資料夾內放的就是內建軟體,有不想要的,直接刪除之。請在刪除之前先弄清楚它能不能刪除。有些官方內建的軟體,刪除了ROM就廢了。當然,你也可以在沒弄清楚的情況下亂刪一氣,只要在刷機完發現問題之後,把刪除的軟體,一個個放回去排查,刷個十遍八遍,大約也就搞定了。所以我們要佩服那麼敢於探索的先驅,不容易啊。
fonts資料夾放的是手機的字型,如果沒有美術細胞的人就不要亂改,改字型有時候會死人的,刺眼、字形不協調、大小不一致等等諸如此類。要改也刷機完以後再改。具體方法要參見自己區的人發的帖子。
lib資料夾顧名思義,是內建軟體的庫檔案。有些軟體需要動態庫支援才能正常使用的,比如常見的輸入法之類的。所以,如果你向一個原本可以正常使用的ROM中加入了新的軟體之後,反而出現某程式意外關閉、某程式意外結束的情況後,那麼基本上就是你忘了把庫檔案給它移動過去。
bin資料夾中放的是系統內建的工具,像什麼busybox,su之類的都在裡面,沒事不要刪除它,可以新增,但不要刪除。
etc資料夾中放置的是系統的設定,諸如無線、GPS、DHCP、撥號、APN列表之類的設定。這個目錄中,如果你改了重要的CONF檔案,則可能系統出問題。也可以改一部分不重要的東西(比如說APN列表)而不出現問題,但貌似APN列表沒必要改。
framework目錄就是系統的UI了,想改介面的人應該改這個目錄中的檔案。。大約也就是替換一些什麼圖片,換掉介面框架什麼的,改改字型顏色什麼的?以達到改換介面的目的。

media目錄是系統內建的媒體檔案,如開機音樂,內建的通話鈴聲、資訊鈴聲、鬧鐘鈴聲,可以改,但格式是OGG的,可以自己去搜尋如何換格式。

usr目錄是系統的部分使用配置,包括鍵盤對映表什麼的,沒事不要改。。。

xbin目錄,好吧,這個目錄可以放一些工具,而且貌似官方本身在裡面放了一個tcpdump,是截獲網路資料包的。沒試過刪除它,推薦有冒險精神的可以刪除之,再將結果告訴我們。

system:系統分割槽.我們刷機器一般就是刷的這個分割槽.
userdata:資料分割槽.
cache:快取分割槽
recovery:Recovery分割槽,相當於建立在hboot與android系統間的一箇中間層,如名字一般,主要用於系統除錯和恢復。.
boot:存放核心和ramdisk的分割槽.
hboot:這個是SPL所在的分割槽,即 bootloader
splash1:這個就是開機第一螢幕了.
radio:這個是無線所在的分割槽,即基帶所在分割槽。
misc:其他分割槽


3.建立一個刷機包,update-script指令碼語法說明

①簡單舉例:建立一個update.zip檔案是很簡單的事情,你所需要做的就是將檔案放置到與Android檔案系統中相對應的資料夾中,然後編寫一個用來複制這些檔案到手機對應位置的update-script, 檔案。作為舉例,比如安裝Calculator.apk到system/app資料夾,複製libsec-ril.so檔案到system/lib資料夾:新建一個空資料夾(本文例:G:\android)新建用來放置Calculator.apk的資料夾C:\android\system\app以及用來放置libsec-ril.so的資料夾G:\android\system\lib。建立用來放置update-script檔案的資料夾G:\android\META-INF\com\google\android。

建立一個名為updater-script的檔案,其內容如下:
1.show_progress 0.1 0
2.
3.copy_dir PACKAGE:systemSYSTEM:
4.
5.show_progress 0.1 10
6.

行1和行5:顯示進度條
行3:複製刷機包中的system資料夾到Android的/system
注意:你應該在檔案的最末尾多新增一個空行(也就是行6)將C:\android壓縮中的所有內容壓縮為zip包(千萬記住:是壓縮android這個資料夾中的內容,不是android資料夾本身)為android.zip籤

②基礎語法篇
1.copy_dir
語法:copy_dir <src-dir> <dst-dir> [<times**p>]
<src-dir>表示原資料夾,<dst-dir>表示目的資料夾,[<times**p>]表示時間戳
作用:將<src-dir>資料夾中的內容複製到<dst-dir>資料夾中。<dst-dir>資料夾中的原始內容將會儲存不變,除非<src-dir>資料夾中有相同的內容,這樣<dst-dir>中的內容將被覆蓋
舉例:copy_dir PACKAGE:system SYSTEM:(將升級包中的system資料夾複製到手機中)

2.format
語法:format <root>
<root>表示要格式化的分割槽
作用:格式化一個分割槽
舉例:format SYSTEM:(將手機/system分割槽完全格式化)
注意:格式化之後的資料是不可以恢復的

3.delete
語法:delete <file1> [... <fileN>]
<file1> [... <fileN>]表示要格式化的檔案,可以是多個檔案用空格隔開
作用:刪除檔案1,2到n
舉例:delete SYSTEM:app/Calculator.apk(刪除手機systen資料夾中app中的Calculator.apk檔案)

4.delete_recursive
語法:delete_recursive <file-or-dir1> [... <file-or-dirN>]
<file-or-dir1> [... <file-or-dirN>]表示要刪除的檔案或資料夾,可以使多個,中間用空格隔開
作用:刪除檔案或者目錄,刪除目錄時會將目錄中的所有內容全部刪除
舉例:delete_recursive DATA:dalvik-cache(刪除/data/dalvik-cache資料夾下的所有內容)

5.run_program
語法:run_program <program-file> [<args> ...]
<program-file>表示要執行的程式,[<args> ...]表示執行程式所加的引數
作用:執行終端程式
舉例:run_program PACKAGE:install_busybox.sh(執行升級包中的install_busybox.sh指令碼)

6.set_perm
語法:set_perm <uid> <gid> <mode> <path> [...<pathN>]
<uid>表示使用者名稱稱,<gid>表示使用者組名稱,<mode>,表示許可權模式,<path> [... <pathN>]表示檔案路徑,可以使多個,用空格隔開
作用:設定單個檔案或目錄的所有者和許可權,像linux中的chmod、chown或chgrp命令一樣,只是集中在了一個命令當中
舉例:set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh(設定手機system中的etc/init.goldfish.sh的使用者為root,使用者組為shell,所有者以及所屬使用者組成員可以進行讀取和執行操作,其他使用者無操作許可權)

7.set_perm_recursive
語法:set_perm_recursive <uid> <gid> <dir-mode><file-mode> <path> [... <pathN>]
<uid>表示使用者,<gid>表示使用者組,<dir-mode>表示資料夾的許可權,<file-mode>表示檔案的許可權,<path> [... <pathN>]表示資料夾的路徑,可以多個,用空格分開
作用:設定資料夾及資料夾中的檔案的所有者和使用者組
舉例:set_perm_recursive 0 0 0755 0644 SYSTEM:app(設定手機system/app資料夾及其中檔案的使用者為root,使用者組為root,app資料夾許可權為所有者可以進行讀、寫、執行操作,其他使用者可以進行讀取和執行操作,其中的檔案的許可權為所有者可以進行讀寫操作,其他使用者可以進行讀取操作)
rwx 對應421 R讀許可權 w寫許可權 x執行許可權

5代表R+X,6代表R+W,7代表R+W+X。一般系統檔案常見的許可權是644。
8.show_progress
語法:show_progress <fraction> <duration>
<表示一個小部分> <表示一個小部分的持續時間>
作用:為下面進行的程式操作顯示進度條,進度條會根據<duration>進行前進,當操作時間是確定的時候會更快
舉例:show_progress 0.1 0(顯示進度條當操作完成後前進10%)

9.symlink
語法:symlink <link-target> <link-path>
<link-target>表示連結到的目標,<link-path>表示快捷方式的路徑
作用:相當於linux中的ln命令,將<link-target>在<link-path>處建立一個軟連結,<link-target>的格式應為絕對路徑(或許相對路徑也可以),<link-path>為“根目錄:路徑”的形式
舉例:symlink /system/bin/su SYSTEM:xbin/su(在手機中system中的xbin中建立一個/system/bin/su的快捷方式)
10.assert
語法:assert <boolexpr>
作用:此命令用來判斷表示式boolexpr的正確與否,當表示式錯誤時程式終止執行※此作用有待驗證

11.package_extract_file/dir語法:package_extract_file(file/dir,file/dir)
作用:提取包中檔案/路徑
舉例:package_extract_dir("system", "/system");
package_extract_file("system/bin/modelid_cfg.sh","/tmp/modelid_cfg.sh");

12.write_radio_image
語法:write_radio_image<src-image>
作用:將基帶部分的映象寫入手機,<src-image>表示映象檔案
舉例:write_radio_imagePACKAGE:radio.img

13.write_hboot_image
語法:write_hboot_image<src-image>
作用:將系統bootloader映象寫入手機,<src-image>表示映象位置,此命令在直到在所有的程式安裝結束之後才會起作用
舉例:write_hboot_imagePACKAGE:hboot.img
14.write_raw_image語法:write_raw_image <src-image> <dest-root>
作用:將boot.img寫入手機,裡面包含了核心和ram盤
舉例:write_raw_image PACKAGE:boot.img BOOT:
③.根目錄以及分割槽的定義(在Android原始碼的root.c檔案中定義)

根目錄:
Linux 塊裝置
/掛載點/
檔案系統
大小 
描述


BOOT:
/dev/mtdblock[?]
/
(RAM)
Raw
核心、記憶體盤和引導配置。

DATA:
/dev/mtdblock5
/data/
yaffs2
91904kb
使用者、系統配置,軟體配置以及軟體(沒有a2sd的話)

CACHE:
/dev/mtdblock4
/cache/
yaffs2
30720kb
OTA快取,recovery/更新配置及臨時資料夾

MISC:
/dev/mtdblock[?]
N/A
Raw,[?]kb
(等待新增)


PACKAGE:
(相對於刷機包)
N/A
刷機包的偽檔案系統。


RECOVERY:
/dev/mtdblock[?]
/
(RAM)
Raw,[?]kb
recovery和更新環境的核心和記憶體盤。類似於BOOT:。

SDCARD:
/dev/mmcblk0(p1)
/sdcard/
fat32
32MB-32GB
TF卡。通常刷機包就放在這裡。

SYSTEM:
/dev/mtdblock3
/system/
yaffs2
92160kb
系統分割槽,靜態且是隻讀的。

TMP:
/tmp/
(RAM)
標準的Linux臨時資料夾

在關機/重啟時清空。

④.具體例項:
1.assert(getprop("ro.product.device")== "Swift" || getprop("ro.build.product") =="swift" || getprop("ro.product.board") =="swift");
2.package_extract_file("system/bin/backuptool.sh","/tmp/backuptool.sh");
3.set_perm(0, 0, 0777,"/tmp/backuptool.sh");
4.run_program("/tmp/backuptool.sh","backup");
5.show_progress(0.500000,0);
6.format("yaffs2","MTD", "system");
7.mount("yaffs2","MTD", "system", "/system");
8.package_extract_dir("recovery","/system");
9.package_extract_dir("system","/system");
10.symlink("busybox","/system/xbin/[", "/system/xbin/[[",
11."/system/xbin/arp", "/system/xbin/ash","/system/xbin/awk",
12."/system/xbin/basename", "/system/xbin/bbconfig","/system/xbin/brctl",
13."/system/xbin/bunzip2","/system/xbin/bzcat", "/system/xbin/bzip2",
14."/system/xbin/cal", "/system/xbin/cat","/system/xbin/catv",
15."/system/xbin/chgrp","/system/xbin/chmod", "/system/xbin/chown",
16."/system/xbin/chroot","/system/xbin/cksum", "/system/xbin/clear",
17."/system/xbin/cmp", "/system/xbin/cp","/system/xbin/cpio",
18."/system/xbin/cut", "/system/xbin/date","/system/xbin/dc",
19."/system/xbin/dd", "/system/xbin/depmod","/system/xbin/devmem",
20."/system/xbin/df", "/system/xbin/diff","/system/xbin/dirname",
21."/system/xbin/dmesg","/system/xbin/dnsd", "/system/xbin/dos2unix",
22."/system/xbin/du", "/system/xbin/echo","/system/xbin/ed",
23."/system/xbin/egrep", "/system/xbin/env","/system/xbin/expr",
24."/system/xbin/false","/system/xbin/fdisk", "/system/xbin/fgrep",
25."/system/xbin/find", "/system/xbin/fold","/system/xbin/free",
26."/system/xbin/freeramdisk", "/system/xbin/fuser","/system/xbin/getopt",
27."/system/xbin/grep","/system/xbin/gunzip", "/system/xbin/gzip",
28."/system/xbin/head","/system/xbin/hexdump", "/system/xbin/id",
29."/system/xbin/ifconfig","/system/xbin/insmod", "/system/xbin/install",
30."/system/xbin/ip", "/system/xbin/kill","/system/xbin/killall",
31."/system/xbin/killall5","/system/xbin/length", "/system/xbin/less",
32."/system/xbin/ln","/system/xbin/losetup", "/system/xbin/ls",
33."/system/xbin/lsmod", "/system/xbin/lspci","/system/xbin/lsusb",
34."/system/xbin/lzop","/system/xbin/lzopcat", "/system/xbin/md5sum",
35."/system/xbin/mkdir","/system/xbin/mke2fs", "/system/xbin/mkfifo",
36."/system/xbin/mkfs.ext2","/system/xbin/mknod", "/system/xbin/mkswap",
37."/system/xbin/mktemp","/system/xbin/modprobe", "/system/xbin/more",
38."/system/xbin/mount","/system/xbin/mountpoint", "/system/xbin/mv",
39."/system/xbin/netstat","/system/xbin/nice", "/system/xbin/nohup",
40."/system/xbin/nslookup","/system/xbin/ntpd", "/system/xbin/od",

41."/system/xbin/patch","/system/xbin/pgrep", "/system/xbin/pidof",
42."/system/xbin/ping","/system/xbin/pkill", "/system/xbin/printenv",
43."/system/xbin/printf", "/system/xbin/ps","/system/xbin/pwd",
44."/system/xbin/rdev","/system/xbin/readlink", "/system/xbin/realpath",
45."/system/xbin/renice","/system/xbin/reset", "/system/xbin/rm",
46."/system/xbin/rmdir","/system/xbin/rmmod", "/system/xbin/ r oute",
47."/system/xbin/run-parts","/system/xbin/sed", "/system/xbin/seq",
48."/system/xbin/setsid", "/system/xbin/sh","/system/xbin/sha1sum",
49."/system/xbin/sha256sum","/system/xbin/sha512sum",
50."/system/xbin/sleep", "/system/xbin/sort","/system/xbin/split",
51."/system/xbin/stat","/system/xbin/strings", "/system/xbin/stty",
52."/system/xbin/swapoff","/system/xbin/swapon", "/system/xbin/sync",
53."/system/xbin/sysctl","/system/xbin/tac", "/system/xbin/tail",
54."/system/xbin/tar", "/system/xbin/tee","/system/xbin/telnet",
55."/system/xbin/test", "/system/xbin/tftp","/system/xbin/time",
56."/system/xbin/top", "/system/xbin/touch","/system/xbin/tr",
57."/system/xbin/trace r oute", "/system/xbin/true","/system/xbin/tty",
58."/system/xbin/tune2fs","/system/xbin/umount", "/system/xbin/uname",
59."/system/xbin/uniq","/system/xbin/unix2dos", "/system/xbin/unlzop",
60."/system/xbin/unzip","/system/xbin/uptime", "/system/xbin/usleep",
61."/system/xbin/uudecode","/system/xbin/uuencode", "/system/xbin/vi",
62."/system/xbin/watch", "/system/xbin/wc","/system/xbin/wget",
63."/system/xbin/which","/system/xbin/whoami", "/system/xbin/xargs",
64."/system/xbin/yes",
65."/system/xbin/zcat");
66.symlink("iwmulticall","/system/xbin/iwconfig", "/system/xbin/iwgetid",
67."/system/xbin/iwlist","/system/xbin/iwpriv",
68."/system/xbin/iwspy");
69.symlink("toolbox","/system/bin/cat", "/system/bin/cmp",
70."/system/bin/date", "/system/bin/dd","/system/bin/dmesg",
71."/system/bin/getevent","/system/bin/getprop", "/system/bin/hd",
72."/system/bin/id", "/system/bin/ifconfig","/system/bin/iftop",
73."/system/bin/insmod","/system/bin/ioctl", "/system/bin/ionice",
74."/system/bin/kill", "/system/bin/log","/system/bin/lsmod",
75."/system/bin/mkdir","/system/bin/nandread", "/system/bin/netstat",
76."/system/bin/newfs_msdos","/system/bin/notify", "/system/bin/printenv",
77."/system/bin/ps","/system/bin/reboot", "/system/bin/renice",
78."/system/bin/rmdir", "/system/bin/rmmod","/system/bin/ r oute",
79."/system/bin/schedtop","/system/bin/sendevent",
80."/system/bin/setconsole","/system/bin/setprop", "/system/bin/sleep",
81."/system/bin/smd", "/system/bin/start","/system/bin/stop",
82."/system/bin/sync", "/system/bin/top","/system/bin/uptime",
83."/system/bin/vmstat","/system/bin/watchprops",
84."/system/bin/wipe");
85.set_perm_recursive(0,0, 0755, 0644, "/system");
86.set_perm_recursive(0,2000, 0755, 0755, "/system/bin");
87.set_perm(0, 3003,02750, "/system/bin/netcfg");
88.set_perm(0, 3004,02755, "/system/bin/ping");
89.set_perm(0, 2000,06750, "/system/bin/run-as");
90.set_perm_recursive(1002,1002, 0755, 0440, "/system/etc/bluetooth");

91.set_perm(0, 0, 0755,"/system/etc/bluetooth");
92.set_perm(1000, 1000,0640, "/system/etc/bluetooth/auto_pairing.conf");
93.set_perm(3002, 3002,0444, "/system/etc/bluetooth/blacklist.conf");
94.set_perm(1002, 1002,0440, "/system/etc/dbus.conf");
95.set_perm(1014, 2000,0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
96.set_perm_recursive(0,2000, 0755, 0750, "/system/etc/init.d");
97.set_perm(0, 0, 0755,"/system/etc/init.d");
98.set_perm(0, 2000, 0550,"/system/etc/init.goldfish.sh");
99.set_perm(0, 0, 0544,"/system/etc/install-recovery.sh");
100.set_perm_recursive(0,0, 0755, 0555, "/system/etc/ppp");
101.set_perm_recursive(0,2000, 0755, 0755, "/system/xbin");
102.set_perm(0, 0, 06755,"/system/xbin/hcitool");
103.set_perm(0, 0, 06755,"/system/xbin/librank");
104.set_perm(0, 0, 06755,"/system/xbin/procmem");
105.set_perm(0, 0, 06755,"/system/xbin/procrank");
106.set_perm(0, 0, 06755,"/system/xbin/su");
107.set_perm(0, 0, 06755,"/system/xbin/tcpdump");
108.show_progress(0.200000,0);
109.show_progress(0.200000,10);
110.package_extract_file("system/bin/backuptool.sh","/tmp/backuptool.sh");
111.set_perm(0, 0, 0777,"/tmp/backuptool.sh");
112.run_program("/tmp/backuptool.sh","restore");
113.package_extract_file("system/bin/modelid_cfg.sh","/tmp/modelid_cfg.sh");
114.set_perm(0, 0, 0777, "/tmp/modelid_cfg.sh");
115.run_program("/tmp/modelid_cfg.sh");
116.package_extract_file("system/bin/verify_cache_partition_size.sh","/tmp/verify_cache_partition_size.sh");
117.set_perm(0, 0, 0777,"/tmp/verify_cache_partition_size.sh");
118.run_program("/tmp/verify_cache_partition_size.sh");
119.show_progress(0.200000,10);
120.assert(package_extract_file("boot.img","/tmp/boot.img"),
121.write_raw_image("/tmp/boot.img", "boot"),
122.delete("/tmp/boot.img"));
123.show_progress(0.100000,0);
124.unmount("/system");


4.BL
Bootloader從字面上來看就是啟動載入的意思。用過電腦的都知道,windows開機時會首先載入bios,然後是系統核心,最後啟動完畢。那麼bootloader就相當於手機的bios,它在手機啟動的時候根據基帶初始化硬體,然後引導系統核心,直到系統啟動。因此可以看出,bootloader很重要,如果bootloader不能正常載入,手機就是磚頭一個,無**常啟動和使用。這也就是為什麼bootloader被鎖的手機必須要XX才能刷第三方rom。如果不XXbootloader,就無法初始化手機硬體,手機也就無法使用。

先思考一下大家為什麼想要解鎖bootloader?肯定都是因為想要刷各種各樣的第三方rom。為什麼大家想要第三方的rom呢?

一是因為官方的rom更新慢,並且官方的rom裡面有各種各樣運營商整合的軟體。而第三方rom是根據google官方的rom原始碼重新打包編譯的,也就是所謂的原生系統,很乾淨。這樣很多使用者都會選擇第三方rom,這就損害了運營商的利益,這是摩托羅拉不願意看到的

二是因為摩托羅拉官方的rom整合了摩托羅拉自己的BLUR服務,主要是一些社交服務,國外的facebook、**等,國內的人人,新浪等。相信很多人都是用不到這些的,這些人也會選擇第三方rom,這也是摩托羅拉不願意看到的。

摩托羅拉不願意看到上面的情況發生,但偏偏安卓系統又是開源的,必須要公佈原始碼,無奈的摩托羅拉只好另闢蹊徑,於是就有了鎖bootloader。核心開源,但bootloader不需要開源,加密bootloader是合理的。於是摩托羅拉鎖了bootloader並且給核心做了檔案簽名,只有簽名通過的核心才能被bootloader識別。這樣一個bootloader鎖誕生了。

bootloader鎖直接導致摩托羅拉的手機無法使用各種第三方的rom,於是很多國外的高手開始XXbootloader。前一段有一個傳聞說bootloader被XX了,但是被摩托羅拉官方發了律師函,於是便不了了之。這也正是摩托羅拉bootloader一直無法XX的原因,一是很難XX,二是高手們怕惹禍燒身。

現在有訊息說,官方會今年晚些時候會為手機解鎖bootloader,算是一個值得期待的好訊息,各位摩托羅拉使用者可以耐心等待一下,不用著急。

最後,送給摩托羅拉官方一句話:解鎖Bootloader—摩托羅拉使用者的心聲。在這個使用者至上的社*會,千萬不要因為一點小利益而忽略了使用者,這注定會失敗,無論你是一個多麼老多麼大的品牌廠商。

在刷機過程中未停電且未斷開資料線的情況下,開不了機普遍有兩種可能。

①boot.img是加過密的。就是鎖了bl。各個手機制造商在做ROM的時候,以他們獨自的加密演算法,對整個檔案進行CRC驗算,然後將驗算值新增到boot.img的最末尾。刷機的時候,手機的硬體BIOS就像一名盡職的士兵,對此進行驗算,對不上口令的,那麼對不起,請君離開,不離開我報警了~~呃,報不了警,那反正我不讓你進門~~

②boot.img還有一個重要的引數,基址 base,用於告訴手機從哪個地址開始,是準備給記憶體盤的入口,哪個地址是給kernel的入口。如果你對不上號,對不起,不能非法入室的。
5.摩托常見刷機方法:

例如:Milestone2系統備份+恢復+ZIP格式的刷機包+映象檔案刷機包的方法,非常適合經常刷機,DIY刷機包的童鞋們使用。先備份好系統後,不管你把ROM弄得怎麼個亂,怎麼個精減。出問題了直接恢復備份好的系統就是你完美的包包了。省去你重新刷機,重新精減,重灌軟體的麻煩事情。

①備份Milestone2系統的方法:
Milestone2必須要ROOT過,獲得許可權。

a.按裝恢復模式工具Droid2Boot 3.0 中文版 Droid2bootstrap3.0.apk (2.34 MB)
b.執行復模式工具-----選擇-----引導恢復模式-----出現許可權---選擇---允許---確定----然後選擇---重啟到恢復模式
c.選擇----backup and restore(備份和恢復)
d. 選擇---backup(備份)---接下來軟體自動備份開始,時間需要幾分鐘左右。
e.備份結束後,選擇---reboot system now----手機重啟
f.完整的Milestone2系統備份儲存在:記憶體卡----clockworkmod資料夾----backup資料夾----備份時間資料夾----備份好的系統-----備份容量大小500多M.

5.jpg

從另一個角度考慮,這也是提取system.img的一種辦法。

Milestone2系統備份還原的方法:
a.執行復模式工具-----選擇-----引導恢復模式-----出現許可權---選擇---允許---確定----然後選擇---重啟到恢復模式
b. 選擇----backup and restore(備份和恢復)
c. 選擇----Recovery(恢復備份的系統)
d. 軟體將會從:記憶體卡----clockworkmod資料夾----backup資料夾----備份時間資料夾----備份好的系統,來恢復你曾經備份過的系統。
e. 恢復備份完成。重啟手機。這樣你完整的Milestone2系統又回來了。

映象檔案的刷機包,刷機方法:
只要把下載好的映象檔案刷機包放入到----記憶體卡-----clockworkmod資料夾------backup資料夾------映象刷機資料夾(檔名只能用英文,不能有空格哦)照著上面的恢復備份方法就可以刷映象檔案的刷機包了。

ZIP格式刷機包,刷機方法:

a.把下載好的ZIP格式的刷機包存放到放到記憶體卡根目錄裡
b.選擇-----重啟到恢復模式,手機重啟
c.選擇install zip from sdcard-----------在選擇--------choose zip from sdcard
d.找到你存放在記憶體卡里的ZIP升級包------選擇YES-------然後系統開始刷寫入手機
e.刷寫完成後,按電源鍵返回------選擇reboot system now,手機重啟,刷機完成

刪除恢復模式的方法:
a:先刪除恢復模式工具
b:用RootExplorer進入/system/bin/
c:點右上角,切換為讀寫狀
d:刪除檔案hijack,刪除檔案logwrapper,把檔案logwrapper.bin改名為logwrapper
e:點選右上角按鈕,切換回只讀狀態
f:重啟手機就OK啦

三、製作工具

1.jdk1.7.0

安裝,配置jdk1.7.0:
執行jdk安裝程式,自定義路徑,我的安裝路徑為:C:\ProgramFiles\Java\jdk1.7.0(根據個人的具體路徑)
配置jdk:配置環境變數:

Win7下為:計算機->屬性->高階系統設定->環境變數->系統變數中新增以下環境變數:
環境變數配置1_2011-07-22_21-28-50.png

JAVA_HOME= C:\Program Files\Java\jdk1.7.0(根據自己的路徑修改)
CLASSPATH=.;C:\Program Files\Java\jdk1.7.0\lib\tools.jar;C:\Program Files\Java\jdk1.7.0\lib\dt.jar
path= C:\Program Files\Java\jdk1.7.0\bin;
寫一個簡單的java程式來測試jdk是否已安裝成功:
public
class
hello
{
public static void main(String args[])
{
System.out.println("Hello");
}
}
將程式儲存為檔名為hello.java的檔案。
開啟命令提示符視窗,進入到hello.java所在目錄,鍵入下面的命令
javac hello.java
java hello
此時若打出來hello則安裝成功,若沒有列印出這句話,仔細檢查以上配置是否正確。
注意系統資料夾選項中應確定“隱藏已知檔案型別的副檔名”不勾選。

2.apktool工具箱

可以解壓放到你的cmd預設目錄下,這樣就不用每次都那麼麻煩進入工具:

2_2011-07-22_22-30-44.png

比如我的預設目錄為C:\Users\users,我就把解壓出來的所有檔案包括:aapt.exe,apktool.bat,apktool.jar放到這個資料夾下,具體的應用自己解決。

簡單應用舉例:主要是在美化時用到。

①apktoold "C:\framework-res.apk" "C:\framework”

命令列解釋:apktool d 要反編譯的檔案輸出資料夾

我們可以看到一個叫做res的目錄,開啟後看到一堆目錄,所有的程式介面資源就放在這個res目錄裡面,我們這裡簡單的介紹一下這些目錄對應的作用。

drawable,這個目錄是放程式需要用到的圖示以及各種圖片的

layout-land,這個目錄是放豎版介面的xml描述檔案的

layout-port,這個目錄是放橫版介面的xml描述檔案的

menu,這個顧名思義,就是放選單佈局的xml描述檔案的

values,這個目錄是漢化重頭戲,絕大部分需要漢化的字串資源定義就在這裡面

xml,其他不再詳細分類的佈局xml描述檔案

一個寫的很規範的Android程式,會把整個程式裡面所用到的字串資源都分離出來,放在values的strings.xml檔案裡面,而放在values目錄的,基本上就是英文字串資源。而一般的程式在處理字串資源上都是交給Android系統去判斷是什麼環境,從而自己選擇語言的

②apktool b"C:\framework"

命令列解釋:apktool b 要打包內容所在資料夾

3.UltraEdit:用於編寫程式碼的好軟體.


5.ROM提取工具

HTC:本人沒有用過HTC的手機,這只是網上找的一篇文章以作參考,具體的還請自己嘗試吧。

第一步:下載官方RUU刷機程式(EXE檔案)
第二步:執行您已經下載的RUU刷機程式RUU_Legend_hTC_Asia_TW_1.31.709.2_Radio_47.26.35.04_7.05.35.26L_release_122023_signed)
第三步:開啟使用者臨時檔案目錄:
以xp為例:C:\Documentsand Settings\Administrator\Local Settings\Temp(系統預設,Administrator為您登入xp的使用者名稱,如果您修改了使用者變數,則到您修改的目錄,例如我的是:D:\Temp\Temp)
第三步:查詢類似 {2EA82A29-B9B5-4A60-BB4F-B52F1BCD2E68}
(每次開啟都不同,建議檢視資料夾建立時間就知道)的資料夾並開啟
第四步:進入剛剛開啟的刷機臨時目錄,開啟該目錄下的唯一資料夾。(例如我的是:{50F2F878-636A-496F-A7CB-544C067E0C4B})
第五步:複製該資料夾下的 Rom.zip
壓縮檔案,該檔案即為官方原版ROM,該檔案大小:135173407位元組(以RUU_Legend_hTC_Asia_TW_1.31.709.2_Radio_47.26.35.04_7.05.35.26L_release_122023_signed
版本為例);該 ROM 包含以下:

檔案列表
檔案大小
檔案說明
其他說明


android-info.txt
85 位元組
ROM版本及刷寫配置資訊

boot.img
2342912 位元組
手機啟動的必要系統(Linux核心)

Linux核心
hboot_7227_0.43.0001_100218.nb0
524288 位元組

bootloader
需要金卡就是因為這個東西吧?刷錯一定變磚

radio.img
24379392 位元組
無線通訊模組(包括電話、WIFI、藍芽)
最新的不一定是最好的。要和hboot匹配?

rcdata.img
41 位元組
指令碼資源
刷機時使用的指令碼

recovery.img
3532800 位元組
刷寫 Recovery 模式(包含硬體底層驅動)
恢復出廠設定、OTA升級補丁升級、Firmware升級

splash1.nb0
393216 位元組
開機第一屏
替換此檔案可以修改開機第一屏

system.img
224364096 位元組
系統核心(應該是主要修改此檔案)
我們主要定製此部分的

userdata.img
2112 位元組
使用者的設定
看起來應該是初始化使用者資料

至此,已獲得官方 RUU 原版ROM
根據我的理解,boot.img radio.img recovery.img splash1.nb0system.img 應該可以單刷的,我們定製 rom 主要修改 system.img。

3)、修改以下程式碼。(此處修改的是預設選中的語言)
1.<modulename="defaultLocale">
2.   <function>
3.   <set name="single">
4.      <item name="auto_detect">false</item>
5.      <item name="defeault">en_GB</item>
6.   </set>
7.   </function>
8.</module>

修改為(簡體中文):
1.<modulename="defaultLocale">
2.    <function>
3.    <set name="single">
4.       <item name="auto_detect">false</item>
5.       <item name="defeault">zh_CN</item>
6.    </set>
7.    </function>
8.</module>

⑩預設時區。在/system/default.prop中修改persist.sys.timezone(如果沒有該項,則手動新增)的值為Asia/Shanghai(即東八區),即

persist.sys.timezone=Asia/Shanghai

注:如果沒有/system/default.prop,也可以在/system/build.prop中修改或新增。

⑾鎖了bl的同學,在修改時注意看執行時的語句,凡是涉及到的功能修改了boot.img,你就趁早刪了update-script相關語句重來吧,不然也不會出什麼大事,就是手機卡在第一屏進不去,或者一直進入恢復模式。解決辦法如果你先前備份了,那就還原一下。如果沒備份,重刷底包吧。

⑿接下來就是打包簽名,按照提示一步一步來就OK了。

五、製作結果與討論:

製作過程是一個需要很多次重新備份或刷機的過程,難點在於update-script的編寫,你必須保證每一句都是對的,不涉及boot.img的語句少一些,一般也就幾十句,或更少,完整的ROM估計在一兩百句之間,雖然廚房會幫你編寫部分語句,但你還得自己開啟來再看一遍,修改新增刪除一些語句,只要其中一句是錯的,你就刷機或者恢復重新再來吧。比如你語句中要新增一個軟體,但包裡沒有這個軟體,這也算錯誤語句,也一樣要悲劇。新的指令碼updater-script不知解決了這個問題沒有。反正舊的指令碼是不行的。

over

轉自http://blog.csdn.net/yuxiangyunei/article/details/44726447

相關文章