Android 的Recovery机制
Android 的Recovery机制
目录
1. 系统的启动模式 1
1.1 Android系统的启动模式 1
1.2 系统的启动模式 2
2. Recovery模式中的三个部分 3
3. Recovery模式中的两个通信接口 3
3.1 主系统和Recovery通过/cache下的文件通信 3
3.2 Bootloader与Recovery通过BCB(Bootloader Control Block)通信 4
4 Recovery模式的基本流程 5
1. 系统的启动模式
1.1 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或其他的启动模式。
1.2 系统的启动模式
由下图可知Android系统启动后可能进入的模式有以下几种:
1. MAGIC KEY(组合键):组合键:若用户在启动刚开始按了指定的recovery组合键,系统会直接进入Recovery模式。
2. Recovery模式:进入系统“设置”->“系统”,有
a) 网络升级
b) 本地升级
c) 系统还原
三种方式进入Recovery模式,完成相应的工作。
3. 正常模式:
若启动过程中用户没有按下任何组合键,bootloader会读取位于MISC分区的启动控制信息块BCB(Bootloader Control Block)。它是一个结构体,存放着启动命令command。根据不同的命令,系统又可以进入三种不同的启动模式:MainSystem、Recovery、Bootloader。
2. Recovery模式中的三个部分
Recovery的工作需要整个软件平台的配合,从通信架构上来看,主要有三个部分。
l MainSystem:即上面提到的正常启动模式(BCB中无命令),是用boot.img启动的系统,Android的正常工作模式。更新时,在这种模式中我们的上层操作就是使用OTA或则从SD卡中升级update.zip包。在重启进入Recovery模式之前,会向BCB中写入命令,以便在重启后告诉bootloader进入Recovery模式。
l Recovery:系统进入Recovery模式后会装载Recovery分区,该分区包含recovery.img(同boot.img相同,包含了标准的内核和根文件系统)。进入该模式后主要是运行Recovery服务(/sbin/recovery)来做相应的操作(重启、升级update.zip、擦除cache分区等)。
l Bootloader:除了正常的加载启动系统之外,还会通过读取MISC分区(BCB)获得来至Main system和Recovery的消息。
3. Recovery模式中的两个通信接口
在Recovery服务中上述的三个实体之间的通信是必不可少的,它们有以下两个通信接口。
3.1 主系统和Recovery通过/cache下的文件通信
Recovery通过/cache/recovery/目录下的三个文件与main system通信。具体如下
l /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
退出并重启
l /cache/recovery/log:Recovery模式在工作中的log打印。在recovery服务运行过程中,stdout以及stderr会重定位到/tmp/recovery.log在recovery退出之前会将其转存到/cache/recovery/log中,供查看。
l /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里的指令去执行相应的操作,是安装升级包还是恢复出厂设置等。
3.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];
};
l command字段:当要重启进入Recovery模式或更新radio、bootloader固件时,linux会更新这个值;当固件更新完成后Bootloader也会更新这个值。另外在成功更新后结束Recovery时,会清除这个成员的值,防止重启时再次进入Recovery模式。
l status字段:在完成相应的更新后,Bootloader会将执行结果写入到这个字段。
l 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模式。
4 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。
流程图如下所示:
Android 的Recovery机制相关推荐
- Android 的Recovery机制【转】
本文转载自:http://blog.csdn.net/fengying765/article/details/38301895 Android 的Recovery机制 目录 1. 系统的启动模式 1 ...
- Android系统升级 Recovery模式(02)Recovery升级过程
该系列文章总纲链接:专题分纲目录 Android系统升级 Recovery模式 本章关键点总结 & 说明: 导图是不断迭代的,这里主要关注➕ recovery升级过程部分即可,主要从 一般升级 ...
- Android Binder IPC机制
之前有很多人问过我TaintDroid的内容,所以一点点吧涉及的思路整理一下. 今天又看了一遍,确实需要很多的技术支持以及扎实的功底,不管是Java的还是Android,从系统底层一直到顶层,涉及的知 ...
- 通过源码分析Android 的消息处理机制
2019独角兽企业重金招聘Python工程师标准>>> #通过源码分析Android 的消息处理机制 我们知道,Android应用是通过消息来驱动的,每一个进程被fork之后,都会在 ...
- Android异步消息机制
2019独角兽企业重金招聘Python工程师标准>>> 目录介绍 1.Handler的常见的使用方式 2.如何在子线程中定义Handler 3.主线程如何自动调用Looper.pre ...
- Android的消息机制(2)
上一节中,是主线程自己发了一个消息到自己的Message Queue中,并把消息从队列中提取出来.那么如何由别的线程发送消息给主线程的Message Queue中呢? 直接看代码~~ 1 2 3 4 ...
- Android事件分发机制详解
2019独角兽企业重金招聘Python工程师标准>>> 之前在学习Android事件方法机制的时候,看过不少文章,但是大部分都讲的不是很清楚,我自己理解的也是云里雾里,也尝试过阅读源 ...
- android触摸事件分发,Android 事件分发机制
Android 事件分发机制一直让人头痛,之前也是面向 GitHub 编程得过且过.今天下定决心了解一下,以便后面自己定制 View 效果.Android 触摸事件有三个基本类型:ACTION_DOW ...
- Android系统Surface机制的SurfaceFlinger服务的线程模型分析
在前面两篇文章中,我们分析了SurfaceFlinger服务的启动过程以及SurfaceFlinger服务初始化硬件帧缓冲区的过程.从这两个过程可以知道,SurfaceFlinger服务在启动的过程中 ...
最新文章
- LM393,LM741可以用作电压跟随器吗?
- 要让GAN生成想要的样本,可控生成对抗网络可能会成为你的好帮手
- 解决ReSharper自动删除换行
- python a any_Python any() 函数
- python压缩映射过滤器
- 1451C. String Equality
- 总结一些C/C++的知识点
- 在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
- Bootstrap HTML 编码规范之语言属性
- Windows的空格预览神器 | QuickLook
- 记Outlook插件与Web页面交互的各种坑 (含c# HttpWebRequest 连接https 的完美解决方法)
- AndroidStudio debug
- Android组件化项目详细实施方案
- linux vsftp 无法上传文件,解决vsftp 不能匿名上传文件的问题
- 微端服务器物品备注,HeroM2引擎怎么在装备上添加备注 传奇添加物品备注说明的方法...
- Discuz网站地图在线生成
- 音乐心理学 | 书籍推荐
- Sqlserver 默认连接 master 库
- python语言中整数1010的二进制是多少_10的二进制是多少哦啊?怎么算 O(∩_∩)O谢谢?...
- 怎么的测试用例是一个好的测试用例?