1.Recovery 简介
Android 利用Recovery 模式,进行恢复出厂设置,OTA 升级,patch 升级及firmware 升级。
升级一般通过运行升级包中的META-INF/com/google/android/update-script 脚本来执行自定义升级,脚本中是一组recovery 系统能识别的UI 控制,文件系统操作命令,例如write_raw_image (写FLASH 分区),copy_dir (复制目录)。该包一般被下载至SDCARD 和CACHE 分区下。
升级中还涉及到包的数字签名,签名方式和普通JAR 文件签名差不错。公钥会被硬编译入recovery ,编译时生成在:out/target/product/XX/obj/PACKAGING/ota_keys_inc_intermediates/keys.inc
2.启动模式
(1)bootloader 模式(正常启动模式)
(a)command == 'boot-recovery' → 启动recovery.img 进入recovery 模式
(b)command == 'update-radio/hboot' → 更新firmware (bootloader)
(c)其他 → 启动boot.img
(2)recovery 模式
3.Recovery涉及到的其他系统及文件
(1)CACHE 分区文件
/cache/recovery/command : recovery 命令,由android主系统写入。
所有命令如下:
--send_intent=anystring - write the text out to recovery.intent
--update_package=root:path - verify install an OTA package file
--wipe_data - erase user data (and cache), then reboot
--wipe_cache - wipe cache (but not user data), then reboot
/cache/recovery/log : recovery 过程日志,由android主系统读出
/cache/recovery/intent : recovery 输出的 intent
Recovery 工具通过 NAND cache 分区上的三个文件和android主系统打交道。android主系统(包括恢复出厂设置和 OTA 升级)可以写入 recovery 所需的命令,读出 recovery 过程中的 LOG 和 intent。
(2)MISC 分区内容
Bootloader Control Block (BCB) 存放 recovery bootloader message 。结构如下:
struct bootloader_message {
char command[32];
char status[32]; // 未知用途
char recovery[1024];
};
command 有以下两个值:
boot-recovery:标示 recovery 正在进行,或指示 bootloader 应该进入 recovery mode
update-hboot/radio:指示 bootloader 更新 firmware
recovery 内容为:
“recovery\n
\n
”
其中 recovery command 为 CACHE:/recovery/command 命令。
========================================================================
1.FACTORY RESET (恢复出厂设置)
(1)用户选择“恢复出厂设置”
(2)设置系统将 "--wipe_data" 命令写入 /cache/recovery/command
(3)系统重启,并进入 recover 模式( /sbin/recovery )
(4)get_args() 将 "boot-recovery" 和 "--wipe_data" 写入 BCB
(5)erase_root() 格式化(擦除) DATA 分区
(6)erase_root() 格式化(擦除) CACHE 分区
(7)finish_recovery() 擦除 BCB
(8)重启系统
2.OTA INSTALL ( OTA 升级)
(1)升级系统下载 OTA 包到 /cache/some-filename.zip
(2)升级系统写入 recovery 命令 "--update_package=CACHE:some-filename.zip"
(3)重启,并进入 recovery 模式
(4)get_args() 将 "boot-recovery" 和 "--update_package=..." 写入 BCB
(5)install_package() 作升级
(7)finish_recovery() 擦除 BCB
(8)** 如果安装包失败 ** prompt_and_wait() 等待用户操作,选择 ALT+S 或 ALT+W 升级或恢复出厂设置
(9)main() 调用 maybe_install_firmware_update()
a.如果包里有 hboot/radio 的 firmware 则继续,否则返回
b.将 "boot-recovery" 和 "--wipe_cache" 写入 BCB
c.将 firmware image 写入 cache 分区
d.将 "update-radio/hboot" 和 "--wipe_cache" 写入 BCB
e.重启系统
f.bootloader 自身更新 firmware
g.bootloader 将 "boot-recovery" 写入 BCB
h.erase_root() 擦除 CACHE 分区
i.清除 BCB
(10)main() 调用 reboot() 重启系统
3.流程图
4.参考:
http://blogold.chinaunix.net/u/14459/showart_1911144.html
阅读(2040) | 评论(0) | 转发(0) |