Chinaunix首页 | 论坛 | 博客
  • 博客访问: 400406
  • 博文数量: 101
  • 博客积分: 2247
  • 博客等级: 大尉
  • 技术积分: 979
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-15 22:39
文章分类

全部博文(101)

文章存档

2012年(1)

2011年(100)

分类: 嵌入式

2011-06-19 02:16:10

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




阅读(2009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~