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 <recovery command>\n <recovery command> ” 其中 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
|