Android 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
G1中的三种启动模式
MAGIC KEY:
camera +
power:bootloader模式,ADP里则可以使用fastboot模式
home + power:recovery模式
正常启动
Bootloader正常启动,又有三种方式,按照BCB(Bootloader
Control Block, 下节介绍)中的command分类:
command == 'boot-recovery'
→ 启动recovery.img。recovery模式
command ==
'update-radio/hboot' → 更新firmware(bootloader)
其他 → 启动boot.img
Recovery涉及到的其他系统及文件
CACHE分区文件
Recovery
工具通过NAND
cache分区上的三个文件和主系统打交道。主系统(包括恢复出厂设置和OTA升级)可以写入recovery所需的命令,读出recovery过程中的LOG和intent。
/cache/recovery/command:
recovery命令,由主系统写入。所有命令如下:
--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过程日志,由主系统读出
/cache/recovery/intent:recovery输出的intent
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命令
两种Recovery
Case
FACTORY
RESET(恢复出厂设置)
用户选择“恢复出厂设置”
设置系统将"--wipe_data"命令写入/cache/recovery/command
系统重启,并进入recover模式(/sbin/recovery)
get_args()
将
"boot-recovery"和"--wipe_data"写入BCB
erase_root()
格式化(擦除)DATA分区
erase_root()
格式化(擦除)CACHE分区
finish_recovery()
擦除BCB
重启系统
OTA
INSTALL(OTA升级)
升级系统下载
OTA包到/cache/some-filename.zip
升级系统写入recovery命令"--update_package=CACHE:some-filename.zip"
重启,并进入recovery模式
get_args()
将"boot-recovery"
和
"--update_package=..."
写入BCB
install_package()
作升级
&
补充:移动开发 , Android ,