1 boot 發現用戶按住升級按鍵,將 recovery.img 作為 ramdisk 讀取到內存。
2 內核根據 ramdisk 中的 init.rc 執行 recovery 腳本。 Recovery 腳本在 sdcard 中找到升級文件後調用 recovery 程序依次做以下操作:
A 檢查升級文件的數字簽名是否可靠。檢查簽名使用的本地密鑰為 /res/keys
B 如果簽名合法則執行提取壓縮包中 META-INF/com/google/android/update-binary 文件重命名到 /tmp/update_binary 並執行該文件。
C update_binary 解析壓縮文件中的 META-INF/com/google/android/updater-script 文件並執行。其升級進度通過管道回傳給 recovery 程序。升級 / 更新可以直接覆蓋目標文件,也可采用二進制補丁形式以減少升級文件的容量,采用的工具為 bsdiff 和 imgdiff 。對於補丁包升級形式,升級數據源可靠性鑒別的依據為 sha1 校驗和數據長度比對。具體要求為: 1 升 級包提供的目標文件的 sha1 值和目標文件計算值符合,即目標正確。 2 進行補丁後的文件 sha1 值和長度符合升級包提供的補丁後的目標文件的長度和 sha1 數值,保證結果正確。兩項有壹項不符合則升級過程停止。為保證第二項操作不損毀最終目標,打補丁的文件會先臨時存儲到 cache 中,等到結果比對正確才進行實際寫入 / 替換目標文件操作。所以此過程要求 cache 目錄必須有足夠空間能夠保存臨時文件。