clockworkmod CWM简单介绍
ClockworkMod Recovery實現應用android一鍵化在線卡刷升級
1、android設備系統簡介
android 設備在內置的Flash設備劃分了很多分區。每個分區有不同的功能作用,介紹幾個主要的:
?
boot:
這個分區裝載的是linux kernel這個就是操作系統的鏡像,系統從bootloader起來以后就是通過加載boot鏡像來啟動和管理整個手機的硬件和軟件的,比如掛載其他分區,SD卡,加載系統APK應用等等一系列工作,他就是整個手機的大腦。
recovery:
這個分區也包含了linux kernel鏡像,只不過啟動之后只加載一些簡單的分區,提供簡單的界面提供給用戶進行卡刷、清除數據、清除緩存以及分區數據備份的功能。本人之后介紹的一鍵在線升級就是通過recovery模式進行加載的;
system:
這個分區存儲了主要的系統應用,以及系統啟動所有必要的服務的執行bin文件。這個分區被掛載以后是RO寫保護的,如果需要對這個分區進行處理的話是需要一些重掛載的操作的。
cache: 這個分區存儲了緩存數據,一般都是不重要的數據;
data: 這個分區是所有應用的數據主要存儲區,在data/data目錄中按照每個應用的包名存放數據,android中每個應用的共享數據、SQLITE數據都是默認存儲在這里。比如說常用的設置、短信、聯系人等等都是如此。
?
Adb shell
Cat /proc/mtd
可以看到掛載的設備
?
dev:??? size?? erasesize? name
mtd0: 00080000 00020000 "obm"
mtd1: 00080000 00020000 "bootloader"
mtd2: 00040000 00020000 "ramdisk"
mtd3: 00040000 00020000 "imei"
mtd4: 00700000 00020000 "arbelbinary"
mtd5: 00100000 00020000 "msabinary"
mtd6: 00400000 00020000 "kernel"
mtd7: 00400000 00020000 "maintenance"
mtd8: 00500000 00020000 "recovery"
mtd9: 00040000 00020000 "misc"
mtd10: 03d40000 00020000 "cache"
mtd11: 0be00000 00020000 "system"
mtd12: 0d200000 00020000 "userdata"
mtd13: 00800000 00020000 "nvm"
mtd14: 00800000 00020000 "telephony"
mtd15: 00200000 00020000 "reserved"
mtd16: 00a00000 00020000 "MRVL_BBM"
?
2、recovery 流程介紹
?
我們不談論如何下載升級包的過程,從卡上存放了一個update.zip作為前提。
?
系統是如何知道我們在界面選擇了升級包后并幫我們一鍵升級的呢
?
????????? 正常主系統在啟動進入bootload的時候會檢查一個BCB數據塊的命令,如果有reboot-recovery命令標志的話則加載recovery.img系統鏡像,如果沒有的話則正常加載boot.img系統就是我們手機的正常啟動過程了(掛載設備、按照init.rc配置進行進程服務的加載)
?
?
參考:http://blog.csdn.net/mu0206mu/article/details/7464987
?
BCB是bootloader與Recovery的通信接口,也是Bootloader與Main system之間的通信接口。存儲在flash中的MISC分區,占用三個page,其本身就是一個結構體,具體成員以及各成員含義如下:
? ? ? ? ? ? ?struct bootloader_message{
? ? ? ? ? ? ? ? ? ? ? ?char command[32];
? ? ? ? ? ? ? ? ? ? ? ?char status[32];
? ? ? ? ? ? ? ? ? ? ? ?char recovery[1024];
? ? ? ? ? ? ? };
? ? ? ? ? ? ①command成員:其可能的取值我們在上文已經分析過了,即當我們想要在重啟進入Recovery模式時,會更新這個成員的值。另外在成功更新后結束Recovery時,會清除這個成員的值,防止重啟時再次進入Recovery模式。
? ? ? ? ? ? ②status:在完成相應的更新后,Bootloader會將執行結果寫入到這個字段。
? ? ? ? ? ? ③recovery:可被Main System寫入,也可被Recovery服務程序寫入。該文件的內容格式為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?“recovery\n
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<recovery?command>\n
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<recovery?command>”
?
????????? 進入recovery模式后,系統會從cache/recovery/command文件讀取執行命令(清除數據、緩存,備份,卡刷升級等等操作)
?
cache/recovery/command文件的來歷:
在一鍵升級的時候,系統首先將“--update_package=root:path”寫入cache/recovery/command文件
/cache/recovery/command:這個文件保存著主系統傳給Recovery的命令行,每一行就是一條命令,支持一下幾種的組合。
--send_intent=anystring ? //write the text out to recovery/intent ? ?在Recovery結束時在finish_recovery函數中將定義的intent字符串作為參數傳進來,并寫入到/cache/recovery/intent中
--update_package=root:path ? //verify install an OTA package file ? ??Main system將這條命令寫入時,代表系統需要升級,在進入Recovery模式后,將該文件中的命令讀取并寫入BCB中,然后進行相應的更新update.zip包的操作。
--wipe_data ? ?//erase user data(and cache),then reboot。擦除用戶數據。擦除data分區時必須要擦除cache分區。
--wipe_cache ? //wipe cache(but not user data),then reboot。擦除cache分區。
?
????????? 根據讀取的命令recovery系統使用/sbin/recovery執行文件來執行命令(清除數據、緩存,備份,卡刷升級等等)
?
做完之后系統reboot,同時刪除BCB控制塊reboot-recovery命令標志,并且刪除cache/recovery/command文件(如果不這樣做的話,系統進一直循環進入recovery模式)
?
?
當然了,升級過程中有任何問題,可以在cache/recovery/log文件查看,該文件存儲了升級過程中的所有打印LOG
?
3、第三方Recovery鏡像介紹
http://wiki.cyanogenmod.com/wiki/Howto:_Using_the_Recovery
?
?
一下兩個是比較有名的recovery工具,如果需要使用的話,要去官網看下支持的機型,不能亂用的哦,小心你的手機變磚。
?
http://www.clockworkmod.com/rommanager這個網址是ClockworkMod Recovery配套的ROM Manager應用支持的機型,一般這個支持的話,你的手機肯定是支持ClockworkMod Recovery的。
?
ClockworkMod Recovery和 Amon_Ra's Recovery都是很有名的第三方 Recovery,功能都很強大,不過前者的使用者更多。它們兩者包括的功能與區別如下。
?
?
ClockworkMod Recovery功能包括:
1. reboot system now:重啟系統
2. apply update from sdcard:從SD卡升級update.zip升級包
3. wipe data/factory reset:擦除數據/恢復出廠設置
4. install zip from sdcard:從SD卡安裝zip升級包
5. backup and restore:備份與恢復
6. mounts and storage:裝載于卸載各個區與存儲器
7. advanced:高級,如對SD卡進行分區,清除 Dalvik緩存等
8. power off:關機
?
?
Amon_Ra's Recovery? 功能包括:
1. Reboot system now:重啟系統
2. USB-MS toggle:把手機和外置SD卡當做USB大容量存儲器
3. Backup/Restore:備份與恢復
4. Flash zip from sdcard:從SD卡刷zip升級包
5. Wipe:擦除數據
6. Partition sdcard:對SD卡進行分區
7. Mounts:裝載或卸載各個分區
8. Other:其他,如修復APK UID錯誤
9. Power off:關機
?
4、利用Clockwork Mod進行擴展一鍵升級升級
http://wifihack.net/blog/2012/04/android-clockworkmod-recovery-system-updat/
?
與android原生的recovery升級流程不一樣的是,Clockwork Mod可以進行擴展定制升級并取消簽名驗證(CWM如果要取消簽名驗證進行升級,不能使用Android默認的)
?
刪除 /cache/recovery/command文件,確保沒有該文件
在 /cache/recovery/extendedcommand寫入相關的升級命令。
同時要在 /sdcard/clockworkmod/.recoverycheckpoint文件做相關的標記。
?
Clockwork Mod相關的腳本見下:
http://pastebin.com/c7S8Nxu4
?
????????? ui_print("ROM Manager Version 4.2.0.2");
????????? restore_rom("/sdcard/clockworkmod/backup/2011-05-13-13.03.52", "boot", "system", "data", "cache", "sd-ext");
????????? backup_rom("/sdcard/clockworkmod/backup/2011-05-13-13.23.20");
????????? install_zip("/sdcard/DRockstar.Clean.Kernel.EC05.v1.04.zip");
????????? backup_rom("/sdcard/clockworkmod/backup/2011-05-13-13.30.09");
????????? run_program("/cache/dowipedalvikcache.sh");
????????? format("/cache");
????????? format("/data");
????????? format("/sd-ext");
?
包含了打印、備份、恢復、升級、格式化。
?
是不是迫不及待的想看看我們的源碼了,下面貼出主要的部分,具體可以參見本文章的結尾處的附件代碼
?
?
FileWritercheckpoint =newFileWriter(CLOCK_WORK_MOD_CHECKPOINT_FILE);
?
??????? try {
??????????? checkpoint.write("1");
??????????? checkpoint.write("\n");
??????? } finally {
??????????? checkpoint.close();
??????? }
?
??????? FileWritercommand =newFileWriter(EXTENDED_FILE);
?
??????? try {
??????????? command.write("ui_print(\"ZPad ROM Manager Version:\"); ");
??????????? command.write("\n");
??????????? command.write("ui_print(\"2012.4.18\");");
??????????? command.write("\n");
??????????? command.write("ui_print(\"Preparing to install ROM...\");");
??????????? command.write("\n");
??????????? //assert(install_zip("/sdcard/update/kvbian-rom-signed-20120417-2112.zip"));
??????????? command.write("format(\"/cache\");");
??????????? command.write("\n");
??????????? command.write("assert(install_zip(\"" +ROMPATH?+"\"));");
??????????? command.write("\n");
??????? } finally {
??????????? command.close();
??????? }
???????
??????? /**
???????? * boot-recovery
???????? * recovery
???????? */
??????? // Having written the command file, go ahead and reboot
??????? PowerManagerpm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
??????? //pm.reboot("recovery");
??????? pm.reboot("recovery");
?
?
效果圖:
?
?
附件代碼的下載地址:
android一鍵recovery升級程序實例
總結
以上是生活随笔為你收集整理的clockworkmod CWM简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片的格式整理
- 下一篇: JS实现数组、对象去重的几种常用方式