recovery介绍

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过程中的LOGintent

    1/cache/recovery/command: recovery命令,由主系统写入。所有命令如下:
         --update_package=path:指定升级包升级
         --wipe_data :格式化data分区

         --wipe_cache : 格式化cache分区

         --show_text :进入recoveryUI界面
     2/cache/recovery/logrecovery过程日志,由主系统读出

     3/cache/recovery/intentrecovery输出的intent

2.2 MISC分区内容

     Bootloader Control Block (BCB) 存放recovery bootloader message 

 结构如下:

       struct bootloader_message {
              char command[32];
              char status[32]; // 未知用途
            char recovery[1024];       
};

command可以有以下两个值: 
   1boot-recovery:标示recovery正在进行,或指示bootloader应该进入recovery mode        

   2update-hboot/radio:指示bootloader更新firmware
 recovery的值:        

   1<recovery command> 其中recovery commandCACHE:/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模式。 

   reboot(String reason):

   如果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.ziptarget-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中的升级包进行升级了。


之前写过一个recovery的PPT,这里也随便贴出来吧:

1


recovery介绍_第1张图片


2


recovery介绍_第2张图片

3


4

recovery介绍_第3张图片

5


6


7
recovery介绍_第4张图片

 

 

 

安卓,安卓

参考:

 

 

 

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

 

你可能感兴趣的:(recovery介绍)