文档章节

Android系统Recovery工作原理之使用update.zip升级过程分析(四)---A...

l
 lxp198837
发布于 2012/06/26 14:15
字数 1448
阅读 1263
收藏 1
Android系统Recovery模式的工作原理


        在使用update.zip包升级时怎样从主系统(main system)重启进入Recovery模式,进入Recovery模式后怎样判断做何种操作,以及怎样获得主系统发送给Recovery服务的命令,这一系列问题的解决是通过整个软件平台的不同部分之间的密切通信配合来完成的。为此,我们必须要了解Recovery模式的工作原理,这样才能知道我们的update.zip包是怎样一步步进入Recovery中升级并最后到达主系统的。

一、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服务中上述的三个实体之间的通信是必不可少的,他们相互之间又有以下两个通信接口。

       (一)通过CACHE分区中的三个文件:

             Recovery通过/cache/recovery/目录下的三个文件与mian 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 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分区。

            /cache/recovery/log:Recovery模式在工作中的log打印。在recovery服务运行过程中,stdout以及stderr会重定位到/tmp/recovery.log在recovery退出之前会将其转存到/cache/recovery/log中,供查看。

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

       (二)通过BCB(Bootloader Control Block):

             BCB是bootloader与Recovery的通信接口,也是Bootloader与Main system之间的通信接口。存储在flash中的MISC分区,占用三个page,其本身就是一个结构体,具体成员以及各成员含义如下:

             struct bootloader_message{

                       char command[32];

                       char status[32];

                       char recovery[1024];

              };

            command成员:其可能的取值我们在上文已经分析过了,即当我们想要在重启进入Recovery模式时,会更新这个成员的值。另外在成功更新后结束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模式。

三、如何从Main System重启并进入Recovery模式

       我们先看一下以上三个部分是怎样进行通信的,先看下图:

                       

               我们只看从Main System如何进入Recovery模式,其他的通信在后文中详述。先从Main System开始看,当我们在Main System使用update.zip包进行升级时,系统会重启并进入Recovery模式。在系统重启之前,我们可以看到,Main System定会向BCB中的command域写入boot-recovery(粉红色线),用来告知Bootloader重启后进入recovery模式。这一步是必须的。至于Main System是否向recovery域写入值我们在源码中不能肯定这一点。即便如此,重启进入Recovery模式后Bootloader会从/cache/recovery/command中读取值并放入到BCB的recovery域。而Main System在重启之前肯定会向/cache/recovery/command中写入Recovery将要进行的操作命令。

         至此,我们就大概知道了,在上层使用update.zip升级时,主系统是怎样告知重启后的系统进入Recovery模式的,以及在Recovery模式中完成什么样的操作。

         下一篇开始分析第一个阶段,即我们在上层使用update.zip包升级时,Main System怎样重启并进入Recovery服务的细节流程。

本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464987

l
粉丝 3
博文 30
码字总数 1087
作品 0
大连
私信 提问
Android系统Recovery工作原理之使用update.zip升级过程分析(三)---A...

Android系统Recovery工作原理之使用update.zip升级过程分析(三)---Android系统的三种启动模式 以下的篇幅开始分析我们在上两个篇幅中生成的update.zip包在具体更新中所经过的过程,并根据源...

lxp198837
2012/06/26
0
0
Android系统Recovery工作原理之使用update.zip升级过程分析(五)---u...

Android系统Recovery工作原理之使用update.zip升级过程分析(五)---update.zip包从上层进入Recovery服务 文章开头我们就提到update.zip包来源有两种,一个是OTA在线下载(一般下载到/CACHE分...

lxp198837
2012/06/26
0
0
Android系统Recovery工作原理之使用update.zip升级过程分析(九)---u...

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程 目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其...

lxp198837
2012/06/26
0
0
Android系统Recovery工作原理之使用update.zip升级过程分析(六)---R...

Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节 Recovery服务毫无疑问是Recovery启动模式中最核心的部分。它完成Recovery模式所有的工作。Recover...

lxp198837
2012/06/26
0
0
Android系统Recovery工作原理之使用update.zip升级过程分析(七)---R...

Android系统Recovery工作原理之使用update.zip升级过程分析(七)---Recovery服务的核心install_package函数 一、 Recovery服务的核心install_package(升级update.zip特有) 和Recovery服务...

lxp198837
2012/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用Javascript评估用户输入密码的强度

密码已经是我们生活工作中必不可少的工具,但一个不安全的密码有又有可能会给我们造成不必要的损失。作为网站设计者,如果我们在网页中能对用户输入的密码进行安全评估,并显示出相应的提示信息...

花漾年华
24分钟前
0
0
Python 打开目录与指定文件

Python打开外部文件有很多方法, os.popen打开外部程序,但发现只能打开文件所在目录的文件 os.system可打开外部文件os.system(command) command 要执行的命令,相当于在Windows...

shzwork
26分钟前
2
0
Leetcode # 118:Pascal's Triangle 杨辉三角

118:Pascal's Triangle 杨辉三角 Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. 给定一个非负整数 *numRows,*生成杨辉三角的前 numRows 行。 ......

iCodeBugs
36分钟前
1
0
IntelliJ IDEA导入Gradle项目

1.File > Open 找到项目后选择build.gradle文件,点击ok image 2.点击Open as Project image 3.选择本地Gradle以及JDK image 4.点OK完成...

青峰Jun19er
40分钟前
1
0
Python实现斐波那契数列

斐波那契数列大家都很熟悉吧,咱们在高中学数学的时候,老师会讲这个定律以及算法,其实数据结构和数学息息相关,数学思维好的往往逻辑思维就比较好,今天小猿圈带大家学习一下python的斐波那...

小猿圈加加
41分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部