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机制

时间: 2024-10-10 20:21:32

Android 的Recovery机制的相关文章

Android 的Recovery机制【转】

本文转载自:http://blog.csdn.net/fengying765/article/details/38301895 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(Bootloa

Android事件分发机制详解:史上最全面、最易懂

前言 Android事件分发机制是每个Android开发者必须了解的基础知识 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化等等 今天,我将全面总结Android的事件分发机制,我能保证这是市面上的最全面.最清晰.最易懂的 本文秉着"结论先行.详细分析在后"的原则,即先让大家感性认识,再通过理性分析从而理解问题: 所以,请各位读者先记住结论,再往下继续看分析: 文章较长,阅读需要较长时间,建议收藏等充足时间再进行阅读 目

Android ScrollView 滚动机制

Android ScrollView 滚动机制 我们都知道通过View#scrollTo(x,y)既可以实现将View滚动的效果,如果再添加Scroller类,就可以实现滚到效果.但是,这背后是如何实现的呢?这个问题涉及到View的绘图机制.我们先看看View的绘图的基本流程 (图片来自于网上比较常见的view绘图流程图) 关于三个阶段的简单描述: 1. measure:预估计ViewTree的各个View的占用空间. 2. layout :   确定ViewTree中各个View所处的空间位置

Android的消息机制之ThreadLocal的工作原理

提到消息机制大家应该都不陌生,在日常开发中不可避免地要涉及到这方面的内容.从开发的角度来说,Handler是Android消息机制的上层接口,这使得开发过程中只需要和Handler交互即可.Handler的使用过程很简单,通过它可以轻松地将一个任务切换到Handler所在的线程中去执行.很多人认为Handler的作用是更新UI,这说的的确没错,但是更新UI仅仅是Handler的一个特殊的使用场景,具体来说是这样的:有时候需要在子线程中进行耗时的IO操作,这可能是读取文件或者访问网络等,当耗时操作

Android异步消息处理机制(3)asyncTask基本使用

本文翻译自android官方文档,结合自己测试,整理如下. 概述 AsyncTask抽象类,翻译过来就是异步任务,能够合理并方便的使用UI线程.该类可以实现将后台操作结果显示在UI线程中,而不需要我们自己实现子线程或者handler(当然它内部也是借助这两者实现的). 虽然AsyncTask可以提供后台运行并将结果显示在UI上,但是理想情况应该是后台操作最多只能是几秒钟,若要执行长时间的操作强烈建议使用java中的Executor,ThreadPoolExecutor,FutureTask等.

聊一聊Android的事件机制

侯 亮 1概述 在Android平台上,主要用到两种通信机制,即Binder机制和事件机制,前者用于跨进程通信,后者用于进程内部通信. 从技术实现上来说,事件机制还是比较简单的.从大的方面讲,不光是Android平台,各种平台的消息机制的原理基本上都是相近的,其中用到的主要概念大概有: 1)消息发送者: 2)消息队列: 3)消息处理循环. 示意图如下: 图中表达的基本意思是,消息发送者通过某种方式,将消息发送到某个消息队列里,同时还有一个消息处理循环,不断从消息队列里摘取消息,并进一步解析处理.

Android事件分发机制

转载请注明出处:http://blog.csdn.net/chziroy/article/details/44401615 要理解Android事件分发机制,首先得了解几个概念,也算是总结,如果暂时看不懂也无妨,本文会讲解这几个问题. 1,点击屏幕,首先事件的传递从Activity的dispatchTouchEvent()方法开始. 2,关于Android事件分发机制,相关方法的方法有三个:onTouchEvent(),dispatchTouchEvent(),还有onInterceptTouc

从NDK在非Root手机上的调试原理探讨Android的安全机制(转载)

从NDK在非Root手机上的调试原理探讨Android的安全机制 最近都在忙着研究Android的安全攻防技术,好长一段时间没有写博客了,准备回归老本行中--Read the funcking android source code.这两天在看NDK文档的时候,看到一句话"Native debugging ... does not require root or privileged access, aslong as your application is debuggable".咦

Android的Message机制

对于Android的Message机制主要涉及到三个主要的类,分别是Handler.Message.Looper:首先对每个类做一个简单介绍:然后再介绍所谓的Android的Message机制是如何实现的,最后给了一个示例. 一.介绍三个相关的类 1. Handler主要有两个用途:首先是可以定时处理或者分发消息,其次是可以添加一个执行的行为在其它线程中执行, 对于Handler中的方法,可以选择你关心的操作去覆盖它,处理具体的业务操作,常见的就是对消息的处理可以覆盖public voidhan