需要了解下Android的Recovery模式

前言

什么是Android的Recovery?

Recovery是Android手机备份功能,指的是一种可以对安卓手机内部的数据或系统进行修改的模式(类似于windows PE或DOS)。在这个模式下可以,对已有的系统进行备份或升级,也可以在此恢复出厂设置。

----百度百科

Android系统的启动模式

一般的Android系统具有下面几种启动模式(适用于Android系统的手机),它们的进入方式和描写叙述例如以下所述(只是参考):

1.一般启动模式(normal mode)

进入方法:按电源键启动

描写叙述:这是正常启动手机的方法

2.安全模式(safe mode)

进入方法:按住menu键,按电源键启动手机。直至手机启动完毕松开menu键

描写叙述:和正常启动一样,但没有登记Google,所以不访问Market或使用你的Google账号

3.引导模式(bootloader mode)

进入方法:按住照相键,按电源键启动手机

描写叙述:能够从SD卡上安装新的系统映像(DREAIMG.NBH),仅仅需再按一次电源键。为获取root权限,对手机进行降级,就是使用这个模式。

4.恢复模式(recovery mode)

进入方法:按住HOME键,按电源键启动手机

描写叙述:能够打开命令解释程序(shell),刷新映像文件(flash image),运行备份等。当然这一切取决于你手机上的recovery image版本号。

5.诊断模式(diagnostic mode)

进入方法:按住轨迹球,按电源键启动手机

描写叙述:用于测试(按音量键选择项目)

6.fastboot模式

进入方法:按住返回键。按电源键启动手机,直至屏幕出现FASTBOOT字样后松开返回键

Android系统不同的启动模式的进入是在不同的情形下触发的,我们从SD卡中升级我们的update.zip时会进入Recovery模式是当中一种,其它的比方:系统崩溃,或则在命令行输入启动命令式也会进入Recovery或其它的启动模式。

由下图可知Android系统启动后可能进入的模式有下面几种:

1.  MAGIC KEY(组合键):若用户在启动刚开始按了指定的recovery组合键,系统会直接进入Recovery模式。

2. Recovery模式:进入系统“设置”->“系统”,有

a) 网络升级
b) 本地升级
c) 系统还原

三种方式进入Recovery模式,完毕对应的工作。

3. 正常模式:

若启动过程中用户没有按下不论什么组合键。bootloader会读取位于MISC分区的启动控制信息块BCB(Bootloader Control Block)。它是一个结构体。存放着启动命令command。

依据不同的命令。系统又能够进入三种不同的启动模式:MainSystem、Recovery、Bootloader。

Recovery模式中的三个部分

Recovery的工作须要整个软件平台的配合,从通信架构上来看。主要有三个部分。

MainSystem:即上面提到的正常启动模式(BCB中无命令),是用boot.img启动的系统,Android的正常工作模式。更新时。在这样的模式中我们的上层操作就是使用OTA或则从SD卡中升级update.zip包。

在重新启动进入Recovery模式之前,会向BCB中写入命令,以便在重新启动后告诉bootloader进入Recovery模式。

Recovery:系统进入Recovery模式后会装载Recovery分区。该分区包括recovery.img(同boot.img同样。包括了标准的内核和根文件系统)。进入该模式后主要是执行Recovery服务(/sbin/recovery)来做对应的操作(重新启动、升级update.zip、擦除cache分区等)。

Bootloader:除了正常的载入启动系统之外。还会通过读取MISC分区(BCB)获得来至Main system和Recovery的消息。

Recovery模式中的两个通信接口

在Recovery服务中上述的三个部分之间的通信是不可缺少的,它们有下面两个通信接口。

1 主系统和Recovery通过/cache下的文件通信

Recovery通过/cache/recovery/文件夹下的三个文件与main system通信。详细举例如下:             

  • /cache/recovery/command:这个文件保存着Main system传给Recovery的命令行,每一行就是一条命令,支持一下几种的组合。

--send_intent=anystring   //write the text out to recovery/intent     
在Recovery结束时在finish_recovery函数中将定义的intent字符串作为參数传进来,并写入到/cache/recovery/intent中。

-update_package=root:path   //verify install an OTA(On The Air) package file  
Main system将这条命令写入时,代表系统须要升级,在进入Recovery模式后,将该文件里的命令读取并写入BCB中,然后进行对应的更新update.zip包的操作。

--wipe_data    //erase user data(and cache),then reboot。
擦除用户数据。擦除data分区时必需要擦除cache分区。

--wipe_cache   //wipe cache(but not user data),then reboot。
擦除cache分区。

--set_encrypted_filesystem=on|off - enables / diasables encrypted fs
启用/禁用加密的文件系统

--just_exit - do nothing; exit and reboot
退出并重新启动

  • /cache/recovery/log:Recovery模式在工作中的log打印。

在recovery服务执行过程中,stdout以及stderr会重定位到/tmp/recovery.log在recovery退出之前会将其转存到/cache/recovery/log中,供查看。

  • /cache/recovery/intent:Recovery传递给Main system的信息。作用不详。

上层应用能够通过调用Android标准的RecoverySystem类(位于frameworks/base/core/java/android/os/RecoverySystem.java中)的接口来完毕与Recovery模式的通信,例如以下图所看到的:

这个类里基本的接口如以下:

installPackage() 重新启动设备安装指定升级包,在/cache/recovery/command里写入”--update_package=/path/xxx.zip”

rebootWipeUserData() 重新启动设备并清除user data分区,这个操作也成为“工厂复位”,

在/cache/recovery/command里写入”--wipe_data”

rebootWipeCache() 重新启动进入Recovery模式。清除cache分区,在/cache/recovery/command里写入”--wipe_data”

verifyPackage() 这个接口主要是用于校验下载回来的的升级包是否符合Android的签名认证。

接口调用后,系统会重新启动,转入Recovery mode,然后recovery进程会去读取/cache/recovery/command里的指令去运行对应的操作,是安装升级包还是恢复出厂设置等。

2 Bootloader与Recovery通过BCB(Bootloader Control Block)通信

BCB是Bootloader与Recovery的通信接口,也是Bootloader与Main system之间的通信接口。存储在flash中的MISC分区。占用三个page,其本身就是一个结构体,详细成员以及各成员含义例如以下,位于/bootloader/revocery/bootloader.h文件里:

struct bootloader_message{

char command[32];

    char status[32];

    char recovery[1024];

};

command字段:当要重新启动进入Recovery模式或更新radio、bootloader固件时。linux会更新这个值。当固件更新完毕后Bootloader也会更新这个值。另外在成功更新后结束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模式。

Recovery模式的基本流程

Recovery模式的基本流程例如以下:

 1. 选择“设置”->“系统”->”系统还原”。

 2. Main system向/cache/recovery/command写入"--wipe_data";

 3. Main system 重新启动进入Recovery模式;

 4. get_args() 函数向 BCB写入"boot-recovery"和"--wipe_data",然后开始擦除。

    -- after this, rebooting will restart the erase --

 5. erase_volume() 又一次格式化/data分区

 6. erase_volume() 又一次格式化/cache分区

 7. finish_recovery() 清除BCB。然后call reboot()进入Main system。

流程图例如以下所看到的:

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值