天天看點

Android Recoveryの流程分析

關于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

流程圖

Android Recoveryの流程分析
Android Recoveryの流程分析
Android Recoveryの流程分析

兩種打包格式

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) 手動輸入更新固件路徑及固件名

==============================================================

Android Recoveryの流程分析

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更新了。

Android Recoveryの流程分析

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. 不擦除使用者資料