ClockworkMod Recovery实现应用android一键化在线卡刷升级
?
?1、android設(shè)備系統(tǒng)簡(jiǎn)介
android 設(shè)備在內(nèi)置的Flash設(shè)備劃分了很多分區(qū)。每個(gè)分區(qū)有不同的功能作用,介紹幾個(gè)主要的:
?
boot:
這個(gè)分區(qū)裝載的是linux kernel這個(gè)就是操作系統(tǒng)的鏡像,系統(tǒng)從bootloader起來(lái)以后就是通過(guò)加載boot鏡像來(lái)啟動(dòng)和管理整個(gè)手機(jī)的硬件和軟件的,比如掛載其他分區(qū),SD卡,加載系統(tǒng)APK應(yīng)用等等一系列工作,他就是整個(gè)手機(jī)的大腦。
recovery:
這個(gè)分區(qū)也包含了linux kernel鏡像,只不過(guò)啟動(dòng)之后只加載一些簡(jiǎn)單的分區(qū),提供簡(jiǎn)單的界面提供給用戶(hù)進(jìn)行卡刷、清除數(shù)據(jù)、清除緩存以及分區(qū)數(shù)據(jù)備份的功能。本人之后介紹的一鍵在線升級(jí)就是通過(guò)recovery模式進(jìn)行加載的;
system:
這個(gè)分區(qū)存儲(chǔ)了主要的系統(tǒng)應(yīng)用,以及系統(tǒng)啟動(dòng)所有必要的服務(wù)的執(zhí)行bin文件。這個(gè)分區(qū)被掛載以后是RO寫(xiě)保護(hù)的,如果需要對(duì)這個(gè)分區(qū)進(jìn)行處理的話是需要一些重掛載的操作的。
cache: 這個(gè)分區(qū)存儲(chǔ)了緩存數(shù)據(jù),一般都是不重要的數(shù)據(jù);
data: 這個(gè)分區(qū)是所有應(yīng)用的數(shù)據(jù)主要存儲(chǔ)區(qū),在data/data目錄中按照每個(gè)應(yīng)用的包名存放數(shù)據(jù),android中每個(gè)應(yīng)用的共享數(shù)據(jù)、SQLITE數(shù)據(jù)都是默認(rèn)存儲(chǔ)在這里。比如說(shuō)常用的設(shè)置、短信、聯(lián)系人等等都是如此。
?
Adb shell
Cat /proc/mtd
可以看到掛載的設(shè)備
?
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 流程介紹
?
我們不談?wù)撊绾蜗螺d升級(jí)包的過(guò)程,從卡上存放了一個(gè)update.zip作為前提。
?
系統(tǒng)是如何知道我們?cè)诮缑孢x擇了升級(jí)包后并幫我們一鍵升級(jí)的呢
?
????????? 正常主系統(tǒng)在啟動(dòng)進(jìn)入bootload的時(shí)候會(huì)檢查一個(gè)BCB數(shù)據(jù)塊的命令,如果有reboot-recovery命令標(biāo)志的話則加載recovery.img系統(tǒng)鏡像,如果沒(méi)有的話則正常加載boot.img系統(tǒng)就是我們手機(jī)的正常啟動(dòng)過(guò)程了(掛載設(shè)備、按照init.rc配置進(jìn)行進(jìn)程服務(wù)的加載)
?
?
參考:http://blog.csdn.net/mu0206mu/article/details/7464987
?
BCB是bootloader與Recovery的通信接口,也是Bootloader與Main system之間的通信接口。存儲(chǔ)在flash中的MISC分區(qū),占用三個(gè)page,其本身就是一個(gè)結(jié)構(gòu)體,具體成員以及各成員含義如下:
? ? ? ? ? ? ?struct bootloader_message{
? ? ? ? ? ? ? ? ? ? ? ?char command[32];
? ? ? ? ? ? ? ? ? ? ? ?char status[32];
? ? ? ? ? ? ? ? ? ? ? ?char recovery[1024];
? ? ? ? ? ? ? };
? ? ? ? ? ? ①command成員:其可能的取值我們?cè)谏衔囊呀?jīng)分析過(guò)了,即當(dāng)我們想要在重啟進(jìn)入Recovery模式時(shí),會(huì)更新這個(gè)成員的值。另外在成功更新后結(jié)束Recovery時(shí),會(huì)清除這個(gè)成員的值,防止重啟時(shí)再次進(jìn)入Recovery模式。
? ? ? ? ? ? ②status:在完成相應(yīng)的更新后,Bootloader會(huì)將執(zhí)行結(jié)果寫(xiě)入到這個(gè)字段。
? ? ? ? ? ? ③recovery:可被Main System寫(xiě)入,也可被Recovery服務(wù)程序?qū)懭搿T撐募膬?nèi)容格式為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?“recovery\n
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<recovery?command>\n
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?<recovery?command>”
?
????????? 進(jìn)入recovery模式后,系統(tǒng)會(huì)從cache/recovery/command文件讀取執(zhí)行命令(清除數(shù)據(jù)、緩存,備份,卡刷升級(jí)等等操作)
?
cache/recovery/command文件的來(lái)歷:
在一鍵升級(jí)的時(shí)候,系統(tǒng)首先將“--update_package=root:path”寫(xiě)入cache/recovery/command文件
/cache/recovery/command:這個(gè)文件保存著主系統(tǒng)傳給Recovery的命令行,每一行就是一條命令,支持一下幾種的組合。
--send_intent=anystring ? //write the text out to recovery/intent ? ?在Recovery結(jié)束時(shí)在finish_recovery函數(shù)中將定義的intent字符串作為參數(shù)傳進(jìn)來(lái),并寫(xiě)入到/cache/recovery/intent中
--update_package=root:path ? //verify install an OTA package file ? ??Main system將這條命令寫(xiě)入時(shí),代表系統(tǒng)需要升級(jí),在進(jìn)入Recovery模式后,將該文件中的命令讀取并寫(xiě)入BCB中,然后進(jìn)行相應(yīng)的更新update.zip包的操作。
--wipe_data ? ?//erase user data(and cache),then reboot。擦除用戶(hù)數(shù)據(jù)。擦除data分區(qū)時(shí)必須要擦除cache分區(qū)。
--wipe_cache ? //wipe cache(but not user data),then reboot。擦除cache分區(qū)。
?
????????? 根據(jù)讀取的命令recovery系統(tǒng)使用/sbin/recovery執(zhí)行文件來(lái)執(zhí)行命令(清除數(shù)據(jù)、緩存,備份,卡刷升級(jí)等等)
?
做完之后系統(tǒng)reboot,同時(shí)刪除BCB控制塊reboot-recovery命令標(biāo)志,并且刪除cache/recovery/command文件(如果不這樣做的話,系統(tǒng)進(jìn)一直循環(huán)進(jìn)入recovery模式)
?
?
當(dāng)然了,升級(jí)過(guò)程中有任何問(wèn)題,可以在cache/recovery/log文件查看,該文件存儲(chǔ)了升級(jí)過(guò)程中的所有打印LOG
?
3、第三方Recovery鏡像介紹
http://wiki.cyanogenmod.com/wiki/Howto:_Using_the_Recovery
?
?
一下兩個(gè)是比較有名的recovery工具,如果需要使用的話,要去官網(wǎng)看下支持的機(jī)型,不能亂用的哦,小心你的手機(jī)變磚。
?
http://www.clockworkmod.com/rommanager這個(gè)網(wǎng)址是ClockworkMod Recovery配套的ROM Manager應(yīng)用支持的機(jī)型,一般這個(gè)支持的話,你的手機(jī)肯定是支持ClockworkMod Recovery的。
?
ClockworkMod Recovery和 Amon_Ra's Recovery都是很有名的第三方 Recovery,功能都很強(qiáng)大,不過(guò)前者的使用者更多。它們兩者包括的功能與區(qū)別如下。
?
?
ClockworkMod Recovery功能包括:
1. reboot system now:重啟系統(tǒng)
2. apply update from sdcard:從SD卡升級(jí)update.zip升級(jí)包
3. wipe data/factory reset:擦除數(shù)據(jù)/恢復(fù)出廠設(shè)置
4. install zip from sdcard:從SD卡安裝zip升級(jí)包
5. backup and restore:備份與恢復(fù)
6. mounts and storage:裝載于卸載各個(gè)區(qū)與存儲(chǔ)器
7. advanced:高級(jí),如對(duì)SD卡進(jìn)行分區(qū),清除 Dalvik緩存等
8. power off:關(guān)機(jī)
?
?
Amon_Ra's Recovery? 功能包括:
1. Reboot system now:重啟系統(tǒng)
2. USB-MS toggle:把手機(jī)和外置SD卡當(dāng)做USB大容量存儲(chǔ)器
3. Backup/Restore:備份與恢復(fù)
4. Flash zip from sdcard:從SD卡刷zip升級(jí)包
5. Wipe:擦除數(shù)據(jù)
6. Partition sdcard:對(duì)SD卡進(jìn)行分區(qū)
7. Mounts:裝載或卸載各個(gè)分區(qū)
8. Other:其他,如修復(fù)APK UID錯(cuò)誤
9. Power off:關(guān)機(jī)
?
4、利用Clockwork Mod進(jìn)行擴(kuò)展一鍵升級(jí)升級(jí)
http://wifihack.net/blog/2012/04/android-clockworkmod-recovery-system-updat/
?
與android原生的recovery升級(jí)流程不一樣的是,Clockwork Mod可以進(jìn)行擴(kuò)展定制升級(jí)并取消簽名驗(yàn)證(CWM如果要取消簽名驗(yàn)證進(jìn)行升級(jí),不能使用Android默認(rèn)的)
?
刪除 /cache/recovery/command文件,確保沒(méi)有該文件
在 /cache/recovery/extendedcommand寫(xiě)入相關(guān)的升級(jí)命令。
同時(shí)要在 /sdcard/clockworkmod/.recoverycheckpoint文件做相關(guān)的標(biāo)記。
?
Clockwork Mod相關(guān)的腳本見(jiàn)下:
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");
?
包含了打印、備份、恢復(fù)、升級(jí)、格式化。
?
是不是迫不及待的想看看我們的源碼了,下面貼出主要的部分,具體可以參見(jiàn)本文章的結(jié)尾處的附件代碼
?
?
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升級(jí)程序?qū)嵗?/p>
總結(jié)
以上是生活随笔為你收集整理的ClockworkMod Recovery实现应用android一键化在线卡刷升级的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: stylus之选择器(Selectors
- 下一篇: 编译性语言、解释性语言和脚本语言的区别