1. 程式人生 > >Android 恢復出廠設定(recovery)

Android 恢復出廠設定(recovery)

Bootloader Control Block(BCB) 存放recovery bootloader message,結構如下:
struct bootloader_message {
    char command[32];
    char status[32];
    char recovery[768];


    // The 'recovery' field used to be 1024 bytes.  It has only ever
    // been used to store the recovery command line, so 768 bytes
    // should be plenty.  We carve off the last 256 bytes to store the
    // stage string (for multistage packages) and possible future
    // expansion.
    char stage[32];
    char reserved[224];
};
command可以有以下兩個值
“boot-recovery”:表示recovery正在進行或者指示bootloader應該進入recovery mode
“update--hboot/radio”:標誌bootloader更新fireware

recovery內容

“recovery\n
<recovery command>\n
<recovery command>\n”其中 recovery command為CACHE:/recovery/command命令


Recovery Case 

Factory reset(恢復出廠設定)



1. 使用者選擇“恢復出廠設定”
2. 設定系統將“--wipe_data”命令寫入 /cache/recovery/command
3. 系統重啟,並進入recovery模式 (sbin/recovery  or /system/bin/recovery)
4. recovery get_args() 將“boot-recovery”和“--wipe_data”寫入BCB
5. erase_root 格式化DATA 分割槽
6. erase_root 格式化CACHE 分割槽
7. finish_recovery 擦除BCB分割槽
8. 重啟系統

OTA INSTALL (OTA升級)

1. 升級系統系在OTA包包/cache/some-filename.zip
2. 升級系統寫入recovery命令 “--update_package=CACHE:some-filename.zip”
3. 重啟系統,進入recovery模式
4. get_args()將“boot-recovery”和“--wipe_packkage=...”寫入BCB
5. install_package 做升級
6. finish_recovery() 擦除BCB
7. **如果安裝包失敗**prompt_and_wait()等待使用者操作,選擇ALT+S或者ALT+W升級或回覆出廠設定
8. main() 裡面呼叫maybe_install_firmware_update()
    1.如果包裡含有hboot/radio的fireware則繼續,否則返回
    2.將"boot-recovery"和"--wipe_cache"寫入BCB
    3.將fireware image寫入cache分割槽
    4.將"update-readio/hboot"和“--wipe_date”寫入BCB
    5.重啟系統
    6.bootloader自身更新fireware
    7.bootloader將"boot-recovery"寫入BCB
    8.erase_root擦除CACHE分割槽
    9.清除BCB
9. main 呼叫reboot重啟系統




Recovery程式碼位置:bootable/recovery/ ,主檔案recovery.cpp