Android 的Recovery机制
Android 的Recovery机制
文件夹
3.1 主系统和Recovery通过/cache下的文件通信
3
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模式的通信,例如以下图所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3lpbmc3NjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
这个类里基本的接口例如以下:
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。
流程图例如以下所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3lpbmc3NjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Android 的Recovery机制的更多相关文章
- Android 的Recovery机制【转】
本文转载自:http://blog.csdn.net/fengying765/article/details/38301895 Android 的Recovery机制 目录 1. 系统的启动模式 1 ...
- Android的Handler机制
Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...
- 讲讲Android事件拦截机制
简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...
- Android多线程通信机制
掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...
- Android事件分发机制(下)
这篇文章继续讨论Android事件分发机制,首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子 ...
- Android事件分发机制(上)
Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...
- Android 事件拦截机制一种粗鄙的解释
对于Android事件拦截机制,相信对于大多数Android初学者是一个抓耳挠腮难于理解的问题.其实理解这个问题并不困难. 首先,你的明白事件拦截机制到底是怎么一回事?这里说的事件拦截机制,指的是对触 ...
- android事件分发机制
android事件分发机制,给控件设置ontouch监听事件,当ontouch返回true时,他就不会走onTouchEvent方法,要想走onTouchEvent方法只需要返回ontouch返回fa ...
- Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析
参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析 一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlin ...
随机推荐
- 用opencv实现的PCA算法,非API调用
理论參考文献:但此文没有代码实现.这里自己实现一下,让理解更为深刻 问题:如果在IR中我们建立的文档-词项矩阵中,有两个词项为"learn"和"study",在 ...
- jsp不通过form和Ajax提交
在页面里面我们一般都通过form表单和Ajax向后台提交请求,但是我如今页面没有form表单,也不想通过ajax异步提交. 解决方式例如以下:location.href="${rootPat ...
- wpf Shake
<Setter Property="RenderTransformOrigin" Value="0.5 0.5" /> <Setter Pro ...
- UVA - 11722 Joining with Friend 几何概率
Joining with Friend You are going from Dhaka to Chittagong by train and you ...
- C#调用mmpeg进行各种视频转换的类实例
本文实例讲述了C#调用mmpeg进行各种视频转换的类.分享给大家供大家参考.具体如下: 这个C#类封装了视频转换所需的各种方法,基本上是围绕着如何通过mmpeg工具来进行视频转换 using Syst ...
- BZOJ 2957 分块
思路: 记录每栋楼楼顶与原点连线的斜率 那么一栋楼可见当且仅当前面所有楼的斜率都小于这栋楼 将n栋楼分为√(0.5*n*logn)块 每一块内维护一个单调上升子序列(注意不是LCS) 比如说4 1 2 ...
- Linux下安装 php-memcache 扩展
需要的库:yum install -y libmemcached libmemcached-devel 下载:https://pecl.php.net/package/memcached 安装: un ...
- 微信小程序 | 小程序的转发问题
1.配置小程序页面静态转发信息 关于小程序转发问题,文档 在 page 页面填加了该监听函数,会在小程序右上角 ... 菜单中显示“转发”按钮: 监听函数需要 return {} 其中的内容配置转发信 ...
- Windows 安装 MySQL8
MySQL8下载地址:https://dev.mysql.com/downloads/mysql/ 解压到安装目录 新建配置文件my.ini [mysqld]# 设置mysql的安装目录basedir ...
- Spring meven 配置
使用maven的仓库化管理,可以更方便有效的控制文件. 在官网下载maven. 官网的地址:http://maven.apache.org/download.cgi 请选择最新的版本下载, 这里我用 ...