1. 程式人生 > >安卓刷機及刷機包製作教程

安卓刷機及刷機包製作教程

刷機有兩種:線刷和卡刷。所謂的“線刷”就是在手機Download模式(俗稱為“挖煤”)下用Odin刷機程式刷機。而“卡刷”就是在手機的Recovery(恢復)模式下刷機。在這一講裡,我來介紹第二種刷機方法:“卡刷”或稱為CWM刷機。論壇中關於“卡刷”的刷機教程比較少,多半都是在刷某個具體的ROM裡給出。可能大家認為“卡刷”的刷機方法比較簡單,不值得寫一個專門的教程。其實對新手來說還是必要的,寫一個詳細教程,供機友參考。

“卡刷”或CWM刷機:用手機裡安裝的ClockworkMod程式來在 Recovery模式下進行刷機。刷機包為單個簽名的zip壓縮包。在刷機包中有一個指令碼,裡面有一系列命令,規定好把不同的檔案複製的手機的指定分割槽,從而達到刷機目的。通常認為,卡刷比較安全,只涉及單個刷機檔案,適合於新手刷機。

ROM釋出者通常釋出ROM補丁來升級ROM。所以,掌握卡刷很有必要,使你能及時更新和欣賞ROM的新功能。同時,卡刷和線刷兩種手段技術互補。

卡刷在下列情況下使用:


  1)手機裡已經安裝了ClockworkMod程式
  2)手機可以進入Recovery模式
  3)當然,你的刷機包是zip卡刷包

卡刷可以用於下列刷機情況:
  1)刷完整ROM
  2)刷ROM的補丁或升級包
  3)刷核心或基帶
  4)刷特殊內容

為敘述方便,以下把上述各種要刷的內容統稱為“刷機包”。下面以刷2.3.4 XXJVP漢化版為例來描述刷機過程和步驟。刷機包檔名為“JVP2.3.4_SunnyOK_CN-2.zip”。

刷機步驟:

1. 把刷機包拷貝到手機SD卡


將手機用USB資料線連線電腦,在“設定”-“USB設定”裡選“大容量儲存”。連線成功後,將刷機包JVP2.3.4_SunnyOK_CN-2.zip
拷貝到SD卡的根目錄下。之後,從手機移除USB資料線。

如果手機有內卡(sdcard),直接把刷機包拷貝到內卡。I897有13G的內卡供使用。當然,你也可以使用外卡。

2. 手機進入Recovery(恢復)模式

有多種方法進入Recovery模式:
1)關機,按“音量上+下”和“電源開關”,螢幕點亮後鬆開按鍵,進入“恢復”模式。
2)用ADB命令:
   在計算機上安裝ADB工具包(見附件ADB-Tools.rar)
   手機開機,到“設定”-“應用程式”-“開發”選“USB除錯”
   將手機用USB資料線連線電腦
   在DOS視窗打入:adb reboot recovery
   進入Recovery(恢復)模式
   取下USB資料線
3)有些ROM裡已經提供進入Recovery的功能。例如Li大的ROM裡提供了“重啟工具”應用。還有的ROM在主題檔案的“關機”選單里加了Recovery的選項。還有的ROM在“高階設定”裡有Recovery操作的選項。
4)其它進Recovery模式方法

3. 刷機


1)進入Recovery模式後,你會看到下面介面:

用音量上下鍵選取“install zip from sdcard”。見紅色方框。然後按電源鍵確認。

2)進入下一個介面:

用音量上下鍵選取“choose zip from sdcard”。見紅色方框。然後按電源鍵確認。

3)進入下一個介面:

在這個介面裡,你可以看到你SD卡上根目錄下的所有目錄和檔案。注意:在第一步裡我們已經把刷機包檔案JVP2.3.4_SunnyOK_CN-2.zip拷貝到了SD卡的根目錄。所以,你現在應該看到這個檔名。見紅色方框部分。
用音量上下鍵選取“JVP2.3.4_SunnyOK_CN-2.zip”。見紅色方框。然後按電源鍵確認。

4)進入下一個介面:

用音量上下鍵選取“Yes – Install JVP2.3.4_SunnyOK_CN-2.zip”來確認刷這個檔案。見紅色方框。然後按電源鍵確認。

5)進入下一個介面。刷機開始。你會看到下列刷機進度資訊和綠色進度條。


6)需要大約一分鐘時間,刷機結束,又回到Recovery模式。在螢幕下半部顯示下列影象。你會看到刷機結束通知:“Install from sdcard complete.”,告訴你:從SD卡的安裝結束了。

在螢幕的上半部出現下列資訊。這與前面的第二個介面相同。現在要選取“+++++Go Back+++++”回到上一個(第一個)Recovery介面。按電源鍵確認。


7)進入主介面。

這時你可以來wipe了。用音量上下鍵選取“wipe data/factory reset”來清除使用者資料,按電源鍵確認。用音量上下鍵選取“wipe cache partition”來清除快取分割槽資料,按電源鍵確認。

8)最後用音量上下鍵選取“reboot system now”重啟手機。

9)刷機結束。



注意事項:

1)老話再說,刷機前把你的資料備份好,電池充好電。
2)刷機前多研究一下ROM內的內容是有益的。把zip開啟看一下里面有什麼檔案。做到心中有數。
3)刷機失敗怎麼辦?沒關係!進入恢復模式重刷。
4)萬一刷機失敗,就需要進“挖煤”去“線刷”了。請閱讀【第一講】的刷機方法。所以,你必須學會用Odin程式刷機。
5)你的手機裡必須已經安裝了ClockworkMod。這取決於上一次刷機的核心。論壇中也有CWM程式,但是隻適用於某一個ROM,這裡不作推薦。
6)官版ROM的Recovery(2e和3e)功能有限,不能刷機。如果你的底包是官版的ROM,可能需要先刷某個要求的ROM做底包,或刷一個指定的核心,得到ClockworkMod。通常ROM釋出者都在刷機指導中對此有明確要求。
7)關於wipe清除以前的使用者資料和快取資料:
  a)如果是刷ROM,建議刷後去雙wipe。
  b)如果是刷特殊補丁,不需要刷後wipe。
  c)如果是刷升級包,通常需要wipe。
  d)如果是刷核心或基帶,不要wipe。
8)有時刷後開不了機,可以試圖去雙Wipe清除以前的使用者資料和快取資料。許多刷機後的奇怪現象與沒有wipe有關。
9)有些升級包給出的檔名為:update.zip。你可以在第一個介面直接選“apply update from sdcard”就可以刷機了。
10)為了便於檔案管理,上述的刷機包也可以放到根目錄下的子目錄內。但是,如果刷機包為update.zip,而且你用“apply update from sdcard”來刷,那隻能把它放在根目錄下。

如何製作刷機補丁和CWM刷機包ROM

在第一講和第二講中介紹過兩種刷機方法:用Odin刷機程式在“挖煤”模式下刷 TAR刷機包(線刷)和在Recovery(恢復)模式下刷zip刷機包(卡刷)。在第五講中教給大家如何製作或定製Odin刷機包ROM(TAR包)。在這一講中,我們來介紹一下製作卡刷刷機包的方法。

在第二講裡的開頭講過:“卡刷”或CWM刷機就是用手機裡安裝的ClockworkMod程式來在Recovery模式下進行刷機。刷機包為單個簽名的zip壓縮包。在刷機包中有一個指令碼檔案,裡面有一系列命令,規定好把不同的檔案內容複製的手機的指定分割槽,從而達到刷機目的。那麼怎樣來製備這種zip刷機包呢?那個指令碼檔案又是什麼呢?

本講的內容包括兩個部分:
   1.製作刷機補丁
   2.製作完整刷機包ROM

通常,兩者都稱作刷機包。在本文中,我們說“刷機補丁”是指ROM的補充內容。例如:在英文底包上刷中文檔案,或者替換字型檔,替換主題或桌面等等。它們不構成可使手機執行的全部檔案,它們僅僅是ROM的一部分。以前,常用update.zip來傳播。當我們說“完整刷機包ROM”時,我們是特指一個獨立完整的ROM,包含一個刷ROM所具有的所有必要刷機元素。

1. 製作刷機補丁

我們都知道,ROM釋出者通常釋出刷機補丁來升級ROM。ROM釋出後,需要增加、重新整理、更改ROM內容或功能時,沒有必要重新安裝整個ROM。只要把需要更新的部分寫成一個“刷機補丁”,刷進手機與已有的系統合併就行了。

在介紹如何製作刷機補丁之前,先讓我們來看一個例項:用刷機補丁來更新兩個主題檔案,把TouchWiz30Launcher.apk和SystemUI.apk複製進手機的/system/app目錄。刷機包補丁檔名為:CWM_Update.zip。

用WinRAR開啟刷機補丁檔案CWM_Update.zip,看到有兩個目錄:
   META-INF     刷機指令碼檔案和簽名
   system         要複製的補丁內容

繼續開啟/system就看到資料夾/app,再下去在 /app下看到要複製的兩個主題檔案TouchWiz30Launcher.apk和SystemUI.apk(見截圖)。從/system目錄開始,所有的目錄結構和akp檔案放置的位置都必須與手機裡的內容一一對應。

然後進入META-INF目錄(見截圖),我們看到有三個檔案和一個字資料夾com。這三個檔案是簽名檔案,是簽名操作產生的。在Android手機裡,所有要刷入手機或在手機裡執行的程式都必須經過簽名。從com繼續向下走,在/META-INF/com/google/android目錄下看到有兩個檔案:
   update-binary 刷機包用的二進位制檔案
   updater-script 刷機包指令碼檔案
這個刷機包指令碼檔案updater-script規定了要刷什麼,刷到哪和怎樣刷。


從這個具體的例子,我們可以總結制作刷機補丁的步驟如下:

1)建立一個工作目錄:先假定它是CWM_Update。
2)在CWM_Update下產生兩個子資料夾:META-INF和system
   CWM_Update/META-INF
   CWM_Update/system
3)再在CWM_Update/system下產生下一級子資料夾,存放補丁的內容。目錄結構和檔案放置要與手機裡的檔案結構完全一致。apk應用程式放在/app下,字型檔放在/fonts下,主題放在/framework下,觸控鍵定義放在/usr/keylayout下,庫檔案放在/lib下,等等。
4)在CWM_Update/META-INF下再產生
   /META-INF/com/google/android
到其它的刷機包裡去把現成的update-binary和 updater-script複製進/android目錄。

我的做法是把META-INF的整個目錄內容都一起復制過了,裡面已經有了三個簽名檔案和刷機包用的二進位制檔案update-binary,一次搞定,省事。不要碰再它們了。
5)現在來編輯指令碼檔案updater-script,它規定了要複製什麼、怎麼複製、複製到什麼地方。用文字編輯器開啟updater-script,看到內容如下:
   mount("MTD", "system", "/system");
   ui_print("Updating system...");
   show_progress(0.100000, 0);
   set_progress(1.000000);
   package_extract_dir("system", "/system");
   show_progress(0.900000, 10);
   ui_print("Update complete!");
   unmount("/system");

對指令碼檔案updater-script內容解釋如下:
mount("MTD", "system", "/system");
掛載MTD、system、/system(system是CWM_Update.zip裡的/system資料夾,/system是手機空間上的資料夾)
ui_print("Updating system...");
手機螢幕顯示提示資訊 Updating system...
show_progress(0.100000, 0);
是控制進度條狀態(進度條當操作完成後前進10%)
set_progress(1.000000);
把進度條手動設定到100%
package_extract_dir("system", "/system");
將CWM_Update.zip的system資料夾下的內容複製到手機的/system
show_progress(0.900000, 10);
同上,是控制進度條狀態(進度條當操作完成後前進90%)
ui_print("Update complete!");
手機螢幕顯示提示資訊 Update complete!
unmount("/system");
解除安裝手機/system檔案系統,刷機到此結束。
注意:在unmount之後必須有一個空行!這是規定。
6)在CWM_Update目錄下,把META-INF和system兩個目錄打包成一個壓縮檔案CWM_Update.zip。

7)最後,用簽名程式Auto-Sign對CWM_Update.zip進行簽名。製作過程結束,刷機補丁就做好了。
註釋:如果你打算製作一個刷機補丁的話,原樣使用這個指令碼檔案就行了,不用做任何修改。在實際製作時,可以直接從已有的刷機補丁中把META-INF目錄完全複製過來,連簽名過程都省了。但是注意檢查一下updater-script的內容,以防造成錯誤後果!

2. 製作完整刷機包ROM

有了上面如何製作刷機補丁做基礎,你也不難製作出一個完整的“卡刷”刷機包 ROM。與製作Odin刷機包相比,這裡沒有複雜的RFS解包和打包過程,不需要Linux環境,所有操作在Windows下就搞定了。編輯 /system目錄下的內容直截了當,刪減和新增內容都方便。

我們還是從一個例項出發,考察ROM結構和檔案的放置,然後歸納製作步驟,介紹製作技巧。
開啟我6月22日的“釋出定製I897 2.3.4 XXJVP ROM升級中文版本”(http://bbs.gfan.com/android-1705916-1-1.html)中的第二個卡刷ROM JVP2.3.4_SunnyOK_CN-2.zip,截圖如下:

META-INF目錄在上一節介紹過了,存放的是簽名檔案和重要的刷機指令碼檔案updater-script。
system目錄下的內容就是你手機裡/system目錄下的內容,一模一樣。
與上一節相比,這裡多了一個目錄updates。它是幹什麼用的呢?開啟就一目瞭然了。updates目錄裡面有三個檔案:modem.bin,zImage和redbend_ua。大家對modem.bin和zImage不陌生吧?它們分別是基帶和核心檔案。另一個檔案 redbend_ua是刷機用的,不用管它,但是,不能刪掉。
最後一個檔案installbusybox也不要動它。
現在再回過頭來看看刷機指令碼檔案updater-script。由於現在要刷進手機的內容多了,所以updater-script的內容也就更復雜了。完整的指令碼檔案給出如下:
show_progress(0.200000, 10);
set_perm(0, 0, 0777, "/sbin/mount");
run_program("/sbin/mount", "/system");
set_perm(0, 0, 0777, "/sbin/mount");
run_program("/sbin/mount", "/dev/block/stl10", "/dbdata");
set_perm(0, 0, 0777, "/sbin/mount");
run_program("/sbin/mount", "CACHE:");
set_perm(0, 0, 0777, "/sbin/mount");
run_program("/sbin/mount", "/dev/block/mmcblk0p2", "/data");
delete_recursive("/system");
delete_recursive("/dbdata");
delete_recursive("/cache");
delete_recursive("/data/dalvik-cache");
delete_recursive("/data");
mount("MTD", "system", "/system");
package_extract_dir("system", "/system");
package_extract_dir("updates", "/tmp");
show_progress(0.200000, 50);
symlink("toolbox", "/system/bin/cat");
symlink("toolbox", "/system/bin/chmod");
symlink("toolbox", "/system/bin/chown");
symlink("toolbox", "/system/bin/cmp");
symlink("toolbox", "/system/bin/date");
symlink("toolbox", "/system/bin/dd");
symlink("toolbox", "/system/bin/df");
symlink("toolbox", "/system/bin/dmesg");
symlink("toolbox", "/system/bin/getevent");
symlink("toolbox", "/system/bin/getprop");
symlink("toolbox", "/system/bin/hd");
symlink("toolbox", "/system/bin/id");
symlink("toolbox", "/system/bin/ifconfig");
symlink("toolbox", "/system/bin/iftop");
symlink("toolbox", "/system/bin/insmod");
symlink("toolbox", "/system/bin/ioctl");
symlink("toolbox", "/system/bin/ionice");
symlink("toolbox", "/system/bin/kill");
symlink("toolbox", "/system/bin/ln");
symlink("toolbox", "/system/bin/log");
symlink("toolbox", "/system/bin/ls");
symlink("toolbox", "/system/bin/lsmod");
symlink("toolbox", "/system/bin/mkdir");
symlink("toolbox", "/system/bin/mount");
symlink("toolbox", "/system/bin/mv");
symlink("toolbox", "/system/bin/nandread");
symlink("toolbox", "/system/bin/netstat");
symlink("toolbox", "/system/bin/newfs_msdos");
symlink("toolbox", "/system/bin/notify");
symlink("toolbox", "/system/bin/printenv");
symlink("toolbox", "/system/bin/ps");
symlink("toolbox", "/system/bin/reboot");
symlink("toolbox", "/system/bin/renice");
symlink("toolbox", "/system/bin/rm");
symlink("toolbox", "/system/bin/rmdir");
symlink("toolbox", "/system/bin/rmmod");
symlink("toolbox", "/system/bin/route");
symlink("toolbox", "/system/bin/schedtop");
symlink("toolbox", "/system/bin/sendevent");
symlink("toolbox", "/system/bin/setconsole");
symlink("toolbox", "/system/bin/setprop");
symlink("toolbox", "/system/bin/sleep");
symlink("toolbox", "/system/bin/smd");
symlink("toolbox", "/system/bin/start");
symlink("toolbox", "/system/bin/stop");
symlink("toolbox", "/system/bin/sync");
symlink("toolbox", "/system/bin/top");
symlink("toolbox", "/system/bin/umount");
symlink("toolbox", "/system/bin/vmstat");
symlink("toolbox", "/system/bin/watchprops");
symlink("toolbox", "/system/bin/wipe");
symlink("/system/bin/dumpstate", "/system/bin/dumpmesg");
symlink("/system/bin/debuggerd", "/system/bin/csview");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm_recursive(0, 0, 0755, 0755, "/system/etc");
set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth");
set_perm_recursive(0, 2000, 0755, 0755, "/system/vendor/bin");
set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor/etc");
set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor/firmware");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 2000, 0755, "/system/vendor");
set_perm(0, 2000, 0755, "/system/vendor/firmware");
set_perm(0, 2000, 0755, "/system/vendor/bin/launch_gps.sh");
set_perm(0, 2000, 0755, "/system/vendor/bin/gpsd");
set_perm(0, 2000, 0755, "/system/etc/bluetooth");
set_perm(0, 3003, 02755, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm(0, 0, 06755, "/system/bin/su");
symlink("/system/bin/su", "/system/xbin/su");
set_perm(0, 0, 06755, "/system/xbin/busybox");
set_perm(0, 0, 755, "/tmp/redbend_ua");
show_progress(0.200000, 60);
set_perm(0, 0, 0777, "/system/xbin/busybox");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin");
show_progress(0.200000, 70);
set_perm(0, 0, 0777, "/tmp/redbend_ua");
run_program("/tmp/redbend_ua", "restore", "/tmp/modem.bin", "/dev/block/bml12");
show_progress(0.200000, 80);
set_perm(0, 0, 0777, "/tmp/redbend_ua");
run_program("/tmp/redbend_ua", "restore", "/tmp/zImage", "/dev/block/bml7");
show_progress(0.200000, 90);
set_perm(0, 0, 0777, "/tmp/redbend_ua");
run_program("/tmp/redbend_ua", "restore", "/tmp/zImage", "/dev/block/bml8");
show_progress(1.000000, 0);
set_perm(0, 1000, 0755, "/system/xbin/busybox");
package_extract_file("installbusybox", "/tmp/installbusybox");
set_perm(0, 0, 0777, "/tmp/installbusybox");
run_program("/tmp/installbusybox");
unmount("/system");

感興趣的機友可以到機鋒論壇或其它論壇去學習指令碼檔案裡的語句和語法,這裡不作介紹。也看看參考目錄中的連結。值得要提的是下面這兩句,用run_program語句把基帶檔案modem.bin複製到bml12分割槽,把核心檔案zImage複製進bml7分割槽。
   run_program("/tmp/redbend_ua", "restore", "/tmp/modem.bin", "/dev/block/bml12");
   run_program("/tmp/redbend_ua", "restore", "/tmp/zImage", "/dev/block/bml7");

現在給出製作完整刷機包ROM的步驟:
1)建立一個工作目錄:先假定它是JVP-ROM。
2)在JVP-ROM下產生三個子資料夾:META-INF,system和updates:
JVP-ROM/META-INF
JVP-ROM /system
JVP-ROM /updates
3)去找一個現成的卡刷刷機包ROM,例如我6月22日發的卡刷包ROM:JVP2.3.4_SunnyOK_CN-2.zip。把解壓後得到的 META-INF和installbusybox都複製進JVP-ROM目錄,把redbend_ua複製進/updates資料夾。
4)在JVP-ROM/system下準備好所用相應的內容。這個不用教你,自己看一下手機裡的/system就清楚了。另外,定製ROM必須會修改和編輯/system。
5)把選好的基帶和核心檔案放到JVP-ROM/updates目錄下。
6)在JVP-ROM目錄下,把META-INF,system,updates和installbusybox一起打包成壓縮檔案JVP-ROM.zip。這就是完成了的完整刷機包ROM了。

註釋:

1)以上沒有說簽名步驟,原因是在第3)步裡已經把簽名檔案都複製過來了,不需要再簽名。
2)如果沒有借用以前的簽名,最後一步就要用簽名程式Auto-Sign對JVP-ROM.zip進行簽名。
3)以上的製作過程借用了已有卡刷ROM的某些元素,使製作過程大大簡化,達到自己的目的。


3. 補充內容:如何單刷基帶和核心

1) 單刷基帶

當單刷基帶時,在/updates資料夾內放基帶檔案modem.bin和複製檔案bmlwrite。刷機指令碼檔案的內容寫為:
  ui_print(" ");
  ui_print(" ");
  ui_print("Flashing I897 modem. Please wait...");
  ui_print(" ");
  package_extract_dir("updates", "/tmp/updates");
  set_perm(0, 0, 755, "/tmp/updates/bmlwrite");
  run_program("/tmp/updates/bmlwrite", "/tmp/updates/modem.bin", "/dev/block/bml12");
  ui_print("Successful! Please reboot.");

2) 單刷核心

當單刷核心時,在/updates資料夾內放核心檔案zImage和複製檔案bmlwrite。刷機指令碼檔案的內容寫為:

  ui_print(" ");
  ui_print(" ");
  ui_print("Flashing I897 kernel. Please wait...");
  ui_print(" ");
  package_extract_dir("updates", "/tmp/updates");
  set_perm(0, 0, 0755, "/tmp/updates/bmlwrite");
  run_program("/tmp/updates/bmlwrite", "/tmp/updates/zImage", "/dev/block/bml7");
  ui_print("Successful! Please reboot.");