recovery原理
1 android启动介绍
Android系统Recovery实际上指的是Andriod系统下Recovery模式,它是Android系统下一种非常重要的启动模式。在Android系统里,一般有三种启动模式,分别是正常启动模式(启动system.img),升级软件或更新固件启动模式(启动update-radio/hboot)和Recovery启动模式(启动recovery.img)。Android系统利用Recovery模式,进行恢复出厂设置,OTA升级,patch升级及firmware升级,系统备份等。
2 Recovery涉及到的其他系统及文件
2.1 CACHE分区文件
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
2.2 MISC分区内容
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命令。
3 Android 提供的recovery接口
3.1 android.os.RecoverySystem
该包提供的接口,主要是往/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。恢复出厂设置
就是调用了该接口的。
3.2android.os.PowerManager
该包提供了一个重启的命令,带指定的参数后,重启后将进入recovery模式。
如果reason的值是”recovery”,系统重启将进入recovery模式。
4 如何生存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)
5 recovery升级方式
对于recovery的升级,对于完整包和差分包,是同样的处理方式的,没有区别的。
5.1 Android指定升级包升级
前面介绍过了Android提供了几个recovery相关的接口,下面介绍下如何使用的。现在假如一个升级包是/sdcard/update.zip,那么如下代码:
File packagefile = new File(“/sdcard/update.zip”);
RecoverySystem.installPackage(Context context, packagefile );
PowerManager.reboot(“recovery”);
这样将重启会进入recovery模式自动进行升级了,升级完成后会自动重启进入新的系统。
5.2进入recovery模式选择文件升级
进入recovery模式有两种方式,分别是硬件触发和软件触发两种方式。
1)硬件触发
在关机情况下,按住音量+键,然后长按Power键,看到boot logo松开Power键,
等进入recovery模式后才松开音量+键。
2)软件触发
将“--show_text ”命令写入/cache/recovery/command文件中,然后调用
PowerManager.reboot(“recovery”),即可进入recovery模式
到此,我们将看到recovery UI界面:
到此,我们将可以选择sdcard中的升级包进行升级了。
到此,我们将可以选择sdcard中的升级包进行升级了。
之前写过一个recovery的PPT,这里也随便贴出来吧:
1
2
3
4
5
6
7
安卓,安卓
参考:
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
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.youkuaiyun.com/conowen/article/details/7253503