recovery原理
Android系统Recovery实际上指的是Andriod系统下Recovery模式,它是Android系统下一种非常重要的启动模式。在Android系统里,一般有三种启动模式,分别是正常启动模式(启动system.img),升级软件或更新固件启动模式(启动update-radio/hboot)和Recovery启动模式(启动recovery.img)。Android系统利用Recovery模式,进行恢复出厂设置,OTA升级,patch升级及firmware升级,系统备份等。
Recovery 工具通过NAND cache分区上的三个文件和主系统打交道。主系统(包括恢复出厂设置和OTA升级)可以写入recovery所需的命令,读出recovery过程中的LOG和intent。
1)/cache/recovery/command: recovery命令,由主系统写入。所有命令如下:
--update_package=path:指定升级包升级
--wipe_data :格式化data分区
--wipe_cache : 格式化cache分区
--show_text :进入recovery的UI界面
2)/cache/recovery/log:recovery过程日志,由主系统读出
3)/cache/recovery/intent:recovery输出的intent
Bootloader Control Block (BCB) 存放recovery bootloader message。
结构如下:
struct bootloader_message { char command[32]; char status[32]; // 未知用途 char recovery[1024]; };
command可以有以下两个值:
1)boot-recovery:标示recovery正在进行,或指示bootloader应该进入recovery mode
2)update-hboot/radio:指示bootloader更新firmware
recovery的值:
1)<recovery command> 其中recovery command为CACHE:/recovery/command命令。
该包提供的接口,主要是往/cache/recovery/command文件写入Recovery命名,命令的格式在2.1点已经介绍过了,主要包含了三个接口,分别是指定升级包升级、格式化cache分区、格式化data分区。
1)installPackage(Context context, File packageFile)
指定升级包升级,packageFile参数指定到zip升级包,然后将往/cache/recovery/command
写入命令:--update_package=xxx/xxx/xxx.zip
2)rebootWipeCache(Context context)
格式化Cache分区,往/cache/recovery/command写入命令: --wipe_cache
3)rebootWipeUserData(Context context)
格式化data分区,往/cache/recovery/command写入命令: --wipe_data。恢复出厂设置
就是调用了该接口的。
该包提供了一个重启的命令,带指定的参数后,重启后将进入recovery模式。
reboot(String reason):
如果reason的值是”recovery”,系统重启将进入recovery模式。
升级包分为两种,分别是完整包和差分包。
1)打完整包命令
make otapackage //完整包命令
将在out/target/product/xxx-xxx/目录下,生成xxx_xxx-ota-xxx.zip升级包
2)打差分包
所谓差分包,那么必须有一个比较的版本吧。所以,想要打差分包,必须有之前版
本的target-file文件,先看看生成target-file的命令:
make target-files-package
将在out/target/product/fiber-xxx/obj/PACKAGING/target_files_intermediates目录下生成
xxx-target_files-xxx.zip的target-file文件,该文件是用来做对比的,所以,我们必须每
一个版本有对应一个个target-file文件,并保存起来。
有了之前版本的target-file文件,那么将可以开始打查分包了,将target-file文件拷贝到
Android的根目录下,并重命名为old_target_files.zip:
make otapackage_inc
将在out/target/product/xxx-xxx/目录下,生成xxx_xxx-ota-xxx-inc.zip差分包。
备注:otapackage_inc命令在原生的代码中我不支持的,需要在build/core/Makefile添加,也是借鉴与otapackage命令的,代码如下:
# OTA update package from old_target_files.zip name := $(TARGET_PRODUCT) ifeq ($(TARGET_BUILD_TYPE),debug) name := $(name)_debug endif name := $(name)-ota-$(FILE_NAME_TAG)-inc INTERNAL_OTA_PACKAGE_TARGET_INC := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_OTA_PACKAGE_TARGET_INC): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR) $(INTERNAL_OTA_PACKAGE_TARGET_INC): $(BUILT_TARGET_FILES_PACKAGE) $(OTATOOLS) @echo "Package OTA: $@" $(hide) ./build/tools/releasetools/ota_from_target_files -v \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ -i ./old_target_files.zip \ $(BUILT_TARGET_FILES_PACKAGE) $@ .PHONY: otapackage_inc otapackage_inc: $(INTERNAL_OTA_PACKAGE_TARGET_INC)
对于recovery的升级,对于完整包和差分包,是同样的处理方式的,没有区别的。
前面介绍过了Android提供了几个recovery相关的接口,下面介绍下如何使用的。现在假如一个升级包是/sdcard/update.zip,那么如下代码:
File packagefile = new File(“/sdcard/update.zip”); RecoverySystem.installPackage(Context context, packagefile ); PowerManager.reboot(“recovery”);
这样将重启会进入recovery模式自动进行升级了,升级完成后会自动重启进入新的系统。
进入recovery模式有两种方式,分别是硬件触发和软件触发两种方式。
1)硬件触发
在关机情况下,按住音量+键,然后长按Power键,看到boot logo松开Power键,
等进入recovery模式后才松开音量+键。
2)软件触发
将“--show_text ”命令写入/cache/recovery/command文件中,然后调用
PowerManager.reboot(“recovery”),即可进入recovery模式
到此,我们将看到recovery UI界面:
到此,我们将可以选择sdcard中的升级包进行升级了。
之前写过一个recovery的PPT,这里也随便贴出来吧:
1
2
3
安卓,安卓
http://www.anzhuoba.com/thread-5985-1-1.html
http://www.anzhuoba.com/forum-viewthread-tid-5985-fromuid-207.html
http://www.cr173.com/html/10766_1.html
http://quanminchaoren.iteye.com/blog/842707
http://www.360doc.com/content/10/0805/09/496343_43774306.shtml
http://www.win7bar.net/tech/other/3627.html
http://wenku.baidu.com/view/394ba13510661ed9ad51f36c.html
http://bbs.gfan.com/android-1612186-1-1.html
http://dev.10086.cn/cmdn/wiki/index.php?doc-view-3943.html
http://baike.baidu.com/view/3785184.htm#sub6185959
比较完整http://blog.csdn.net/conowen/article/details/7253503