android recovery模式

Android手机开机后,会先运行 bootloaderBootloader 会根据某些判定条件(比如按某个特殊键)决定是否进入 recovery模式。Recovery模式会装载recovery 分区,该分区包含recovery.imgrecovery.img包含了标准内核(和boot.img中的内核相同)以及recovery根文件系统。


菜单说明:

Options

名称

Description

Reboot system now

重启系统

立即重启系统

Factory reset

恢复出厂设置

1. 从backup分区获取update.img 

2. 还原除了backup以外所有分区固件
3. 格式化USERDATA 
4. 格式化CACHE

Update from SDCard

从SD卡升级

1. 从“update-script”获取升级命令 

2. 从SD卡根目录获取升级固件update.im
3. 升级所有固件,除了BACKUP分区
4. 不擦除用户数据

Update from uDisk

从U盘升级

1. 从“update-script”获取升级命令 

2. 从uDisk根目录获取升级固update.img
3. 升级所有固件,除了BACKUP分区
4. 不擦除用户数据


android recovery总体流程



BCB是bootloader与Recovery的通信接口,也是Bootloader与Main system之间的通信接口。存储在flash中的MISC分区,占用三个page,其本身就是一个结构体,具体成员以及各成员含义如下:

             struct bootloader_message{

                       char command[32];

                       char status[32];

                       char recovery[1024];

              };

            command成员:其可能的取值我们在上文已经分析过了,即当我们想要在重启进入Recovery模式时,会更新这个成员的值。另外在成功更新后结束Recovery时,会清除这个成员的值,防止重启时再次进入Recovery模式。

            status:在完成相应的更新后,Bootloader会将执行结果写入到这个字段。

            recovery:可被Main System写入,也可被Recovery服务程序写入。该文件的内容格式为:

                               “recovery\n

                               <recovery command>\n

                               <recovery command>”

            该文件存储的就是一个字符串,必须以recovery\n开头,否则这个字段的所有内容域会被忽略。“recovery\n”之后的部分,是/cache/recovery/command支持的命令。可以将其理解为Recovery操作过程中对命令操作的备份。Recovery对其操作的过程为:先读取BCB然后读取/cache/recovery/command,然后将二者重新写回BCB,这样在进入Main system之前,确保操作被执行。在操作之后进入Main system之前,Recovery又会清空BCB的command域和recovery域,这样确保重启后不再进入Recovery模式。



 ui_init():Recovery服务使用了一个基于framebuffer的简单ui(miniui)系统。这个函数对其进行了简单的初始化。在Recovery服务的过程中主要用于显示一个背景图片(正在安装或安装失败)和一个进度条(用于显示进度)。另外还启动了两个线程,一个用于处理进度条的显示(progress_thread),另一个用于响应用户的按键(input_thread)。





update.zip包的目录结构
          |----boot.img    //更新boot分区所需要的文件。这个boot.img主要包括kernel+ramdisk。
          |----system/      //system/目录的内容在升级后会放在系统的system分区。主要用来更新系统的一些应用或则应用会用到的一些库等等。

                                   //可以将Android源码编译out/target/product/tcc8800/system/中的所有文件拷贝到这个目录来代替。
          |----recovery/    //recovery/目录中的recovery-from-boot.p是boot.img和recovery.img的补丁(patch),主要用来更新recovery分区,

                                    //其中etc/目录下的install-recovery.sh是更新脚本。
                `|----recovery-from-boot.p
                `|----etc/
                        `|----install-recovery.sh
          |---META-INF/
              `|CERT.RSA          //与签名文件相关联的签名程序块文件,它存储了用于签名JAR文件的公共签名。
              `|CERT.SF             //这是JAR文件的签名文件,其中前缀CERT代表签名者。
              `|MANIFEST.MF   //定义了与包的组成结构相关的数据。类似Android应用的mainfest.xml文件。
              `|----com/
                     `|----google/
                             `|----android/
                                    `|----update-binary   //update-binary是一个二进制文件,相当于一个脚本解释器,能够识别updater-script中描述的操作。

                                                                       //该文件在Android源码编译后out/target/product/tcc8800/system bin/updater生成,可将updater重命名为update-binary得到。

                                                                      //该文件在具体的更新包中的名字由源码中bootable/recovery/install.c中的宏ASSUMED_UPDATE_BINARY_NAME的值而定。
                                    `|----updater-script     //此文件是一个脚本文件,具体描述了更新过程。我们可以根据具体情况编写该脚本来适应我们的具体需求。

                                                                         //该文件的命名由源码中bootable/recovery/updater/updater.c文件中的宏SCRIPT_NAME的值而定。
                             `|----android/
                                    `|----metadata           //是描述设备信息及环境变量的元数据。主要包括一些编译选项,签名公钥,时间戳以及设备型号等。


我们还可以在包中添加userdata目录,来更新系统中的用户数据部分。这部分内容在更新后会存放在系统的/data目录下。

update.zip更新包在制作完成后需要对其签名,否则在升级时会出现认证失败的错误提示。而且签名要使用和目标板一致的加密公钥。


  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值