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机制的更多相关文章

  1. Android 的Recovery机制【转】

    本文转载自:http://blog.csdn.net/fengying765/article/details/38301895 Android 的Recovery机制 目录 1. 系统的启动模式 1 ...

  2. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

  3. 讲讲Android事件拦截机制

    简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...

  4. Android多线程通信机制

    掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...

  5. Android事件分发机制(下)

    这篇文章继续讨论Android事件分发机制,首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子 ...

  6. Android事件分发机制(上)

    Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...

  7. Android 事件拦截机制一种粗鄙的解释

    对于Android事件拦截机制,相信对于大多数Android初学者是一个抓耳挠腮难于理解的问题.其实理解这个问题并不困难. 首先,你的明白事件拦截机制到底是怎么一回事?这里说的事件拦截机制,指的是对触 ...

  8. android事件分发机制

    android事件分发机制,给控件设置ontouch监听事件,当ontouch返回true时,他就不会走onTouchEvent方法,要想走onTouchEvent方法只需要返回ontouch返回fa ...

  9. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

    参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析 一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlin ...

随机推荐

  1. Share Your Knowledge and Experiences

     Share Your Knowledge and Experiences Paul W. Homer FRoM All oF ouR ExpERiEnCES, including both suc ...

  2. 0x16 Trie

    这章刷的真带劲 嘿嘿 裸题 #include<cstdio> #include<iostream> #include<cstring> #include<cs ...

  3. 关于spring和extjs对接的过程简述

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  4. C++ MAP使用

    1. map的构造函数map<int,string> maphai;map<char,int> maphai;map<string,char> mapstring; ...

  5. Repeater控件使用小结持续更新

    Repeater嵌套Repeater绑定数据 前台代码 <!--注意层级关系不要写错了--> <asp:Repeater ID="rpGroup" runat=& ...

  6. [ OS ][ Linux ] [ SA ] root 帳號名稱修改

    1. 背景: 由於 Linux 中預設最高權限的使用者一律為 root, 存在安全性的疑慮. 所以比較安全的作法要將 root 帳號改名為其他名稱,讓要入侵的人需要同時破解出帳號和密碼才可以進入主機, ...

  7. Temporary Tables临时表

    1简介 ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables.这些临时表用来保存一个会话SESSION的数据, 或者保存在一个事务中需要的数据.当会话退出或者用户提 ...

  8. ibatiS启动的异常 The content of elements must consist of well-formed character data or markup

    ibatiS启动的异常 The content of elements must consist of well-formed character data or markup 配置的动态SQL语句里 ...

  9. solarwinds之配置系统管理(System manager)

    配置windows的 1.  打开System Manager   2.  点击new新加一个接口   3.  选择要监控的资源   4.  确认好自己要监控的资源后如下   5.  这里以监控内存使 ...

  10. Pyhton学习——Day54

    #Django内容回顾# -请求响应HTTP协议(有.无状态)默认传递的是字符串# 传递字符串分为两个部分:1.http1.1 GET /url /index + 请求头# Provisional h ...