關于recovery的代碼分析,見另一篇
Android Recoveryの代碼分析
做個升級程序,支持SD卡、U盤、Flash三種路徑升級
該升級應用程序要和/recovery/sbin/下的recovery配套使用,
固件共有boot.img,recovery.img,system.img,
其中system.img是空的,system.img打包格式要和recovery.img匹配
使用此程序:
先把librecovery.so是添加到rootfs文件系統庫中,
再把應用程序recovery_sample添加到某目錄下,
然后執行recovery_sample就可以實現update功能
文檔包括四部分:
l update庫和應用文件
l update使用及命令
l 輸入命令格式例子
l update/recovery界面
1、Update庫和應用文件
文件一:Recovery
是存在于/gingerbread/bootable/,用于生成recovery可執行文件,生成完將其拷貝到UpdateRecoveryfs/recoveryfs/sbin/目錄下
文件二:UpdateLibSample
用于生成update應用的庫文件librecovery.so和可執行文件recovery_sample
文件三:UpdateRecoveryfs
用于生成recovery.img,有ramdisk和cramfs兩種格式
文件四:UpdateRootfs
用于生成boot.img,有ramdisk和cramfs兩種格式
ramdisk 格式:
./mkbootfs recoveryfs | ./minigzip > ramdisk-recovery.img && \
./mkkrnlimg ramdisk-recovery.img recovery.img
rm ramdisk-recovery.img
Cramfs 格式:
./mkfs.cramfs -n v1.01 recoveryfs recovery.img
Boot.img和recovery.img打包格式要一致,統一為ramdisk或者cramfs
流程圖



兩種打包格式
ramdisk格式:
./mkbootfs recoveryfs | ./minigzip > ramdisk-recovery.img && \
./mkkrnlimg ramdisk-recovery.img recovery.img
rm ramdisk-recovery.img
Cramfs格式:
./mkfs.cramfs -n v1.01 recoveryfs recovery.img
2、update使用及命令
輸入 ./recovery_sample可以查看幫助
==============================================================
快捷方式 等效命令
2 --wipe_cache格式化cache
3 --wipe_userdata格式化用戶數據
4 --wipe_udisk格式化U盤數據
6 --recover_image=BACKUP:update.img恢復出廠設置,從backup還原所有固件
7 --update_image=SDCARD:update.img默認路徑,從SD卡根目錄下固件update.img升級
9 --update_kernel單獨升級kernel,從SD卡update.img中取得kernel固件
10 --update_boot單獨升級boot,從SD卡update.img中取得boot固件
11 --update_system單獨升級system,從SD卡update.img中取得system固件
12 --update_recovery單獨升級recovery,從SD卡update.img中取得recovery固件
13 --update_backup單獨升級backup分區,拷貝SD卡的update.img到backup
14 --update_parameter單獨升級parameter,從SD卡update.img中取得parameter
15 --update_loader單獨升級loader,從SD卡update.img中取得loader
16 (user define path name) 手動輸入升級固件路徑及固件名
==============================================================

l 2-4三個功能實現單獨或者同時擦除cache userdata udisk內容
l 6 功能recover_image=BACKUP:update.img是從BACKUP分區獲取update.img,然后取出recovery-script腳本命令并執行,還原固件
l 9-15七個功能分別實現升級kernel、boot、system、recovery、backup、parameter和loader,如果沒有指定升級固件路徑和名稱,默認是SDCARD:update.img。
l 16 功能是自定義升級固件的路徑和名稱
3、輸入命令格式例子
Ø 格式化cache
./recovery_sample 2
Ø 從backup還原所有固件
./recovery_sample 6
Ø 格式化和升級混合,用空格隔開
./recovery_sample 2 3 4 12
Ø 手動輸入升級命令,自定義升級固件路徑和名稱
./recovery_sample --update_image=BACKUP:update.img
./recovery_sample --update_image=SDCARD:/rockchip/rkdroid.img 9
./recovery_sample --update_image=CACHE:/cache/update.img 9 14
./recovery_sample --update_image=uDisk:update.img 11
注意,在從mtd分區升級之前需要把分區mount到某個文件,然后把固件拷貝到這個文件目錄下
10個MTD分區對應名字和信息如下:
#cat proc/mtd
dev: size erasesize name
mtd0: 00400000 00001000 "misc"
mtd1: 00800000 00001000 "kernel"
mtd2: 00400000 00001000 "boot"
mtd3: 00800000 00001000 "recovery"
mtd4: 10000000 00001000 "system"
mtd5: 10400000 00001000 "backup"
mtd6: 07400000 00001000 "cache"
mtd7: 10000000 00001000 "userdata"
mtd8: 00400000 00001000 "kpanic"
mtd9: 3dd00000 00001000 "user"
例如從cache升級,需要把cache掛接到/dev/mtdblock6,就可以從cache升級了。

4、recovery界面說明
Reset以后按住home+power組合鍵,可直接進入recovery/update界面。
在log中如果看到
RECOVERY key is pressed
COMBINATION key is pressed
說明將要進入recovery模式
按鍵: | 說明: |
vol+ | 向下,支持菜單循環選擇 |
vol - | 向上,支持菜單循環選擇 |
Play | 確認當前選擇 |
按鍵可以自己定義,修改gingerbread/bootable/recovery/etc/int.rc
菜單說明:
Options | 名稱 | Description |
Reboot system now | 重啟系統 | 立即重啟系統 |
Factory reset | 恢復出廠設置 | 1. 從backup分區獲取update.img 2. 還原除了backup以外所有分區固件 3. 格式化USERDATA 4. 格式化CACHE |
Update from SDCard | 從SD卡升級 | 1. 從“update-script”獲取升級命令 2. 從SD卡根目錄獲取升級固件update.im 3. 升級所有固件,除了BACKUP分區 4. 不擦除用戶數據 |
Update from uDisk | 從U盤升級 | 1. 從“update-script”獲取升級命令 2. 從uDisk根目錄獲取升級固update.img 3. 升級所有固件,除了BACKUP分區 4. 不擦除用戶數據 |