Android OTA升级原理和流程分析(四)---Android系统Recovery模式的工作原理_linux c大咖的博客-程序员信息网

技术标签: android  OTA  

        在使用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服务的细节流程

上一篇:Android OTA升级原理和流程分析(三)---Android系统的三种启动模式

下一篇:Android OTA升级原理和流程分析(五)---update.zip包从上层进入Recovery服务

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ljj342018214/article/details/108529297

智能推荐

[Linq]LINQ的左连接、右连接、内连接_厦门德仔的博客-程序员信息网_c# linq 左连接

1、左连接:var LeftJoin = from emp in ListOfEmployeesjoin dept in ListOfDepartmenton emp.DeptID equals dept.ID into JoinedEmpDeptfrom dept in JoinedEmpDept.DefaultIfEmpty()select new {EmployeeName = emp.Name,DepartmentName = dept

字符型图片验证码识别完整过程及Python实现_风中追风风的博客-程序员信息网

1摘要验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的防火墙功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻。本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义。文章更新:2017-09-20本文的基于传统的机器学习SVM的源码共享:介绍文章:http://www.cnblogs.com/bee...

ArcGIS学习总结(九)——将.kml转换为.shp_Arcgiser的博客-程序员信息网_kml转shp

打开ArcMap,选择ArcToolbox-&gt;Conversion Tools-&gt;From KML-&gt;KML To Layer在打开的对话框中选择Input KML File,其他选项默认即可。本次所选择的kml文件中包含了点和线。点击ok,弹出进度条对话框,转换完成以后对话框自动关闭。...

C语言字符串输入函数 scanf,gets,fgets 的比较与解析_OneLine_的博客-程序员信息网_c语言中文件的字符串输入函数是

想先讲一下,关于输入字符串输入如果是单个字符输入 要在输入前后都要加上 getchar() 读取空字符个人经验,如有错误请指出。原博地址:https://blog.csdn.net/jzqt_t/article/details/38315675许多ACMer在做ACM题时经常会被一些字符串输入搞混,如果认为几个字符串输入函数的功能基本一样那就大错特错了。今天把C语言中的三个字符串输入函数(scan...

python3.6环境下使用pyinstaller无法成功生成EXE可执行文件_晒太阳的魚的博客-程序员信息网

目前pyinstaller稳定版Release 3.2.1: stable, supports Python 2.7, 3.3–3.5,不支持python 3.6(可以安装,但无法使用)。使用3.6的亲们可以使用“pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz”命令安装最新的开发版pyins...

随便推点

linux的traceroute命令详解_雪域白狼的博客-程序员信息网_traceroute6

traceroute命令详解traceroute [-46dFITUnrAV] [-f first_ttl] [-g gate,...]        [-i device] [-m max_ttl] [-p port] [-s src_addr]        [-q nqueries] [-N squeries] [-t tos]        [-l flow_label] [-w wait...

测试人生 | 突破“大专学历+半路转行”标签,从拉垮到测试团队骨干,走到这一步很知足_霍格沃兹测试开发的博客-程序员信息网

原文链接️ 关注霍格沃兹测试学院公众号,回复「面试」,领取测试开发面试真题合集!编者按:本文是霍格沃兹测试学院学员 @XiaoW 分享的测试人生故事,作为学习群阳光活跃的“学习小王子”,背后竟有如此曲折和令人钦佩的经历,这种积极向上的力量极具感染力,也发人深省,当幸福来敲门时,你是否做好了准备?在霍格沃兹测试学院收获很多,应学院的邀请,分享下我个人的测试技术成长经历,深感荣幸,请大家多多指教!为告别频繁出差,从传统制造业转向 IT 行业我转行进入 IT 行业有 2 年多时间了,在这之前,一直

自适应滤波:维纳滤波器——LCMV及MVDR实现_weixin_33734785的博客-程序员信息网

作者:桂。时间:2017-03-24  06:52:36链接:http://www.cnblogs.com/xingshansi/p/6609317.html 声明:欢迎被转载,不过记得注明出处哦~ 【读书笔记03】前言西蒙.赫金的《自适应滤波器原理》第四版,上一篇看到维纳滤波基本形式:最优化问题,且无任何条件约束。这次看到有约束的部分,简单整理一下思路: ...

MD5摘要算法的几种解密方法,分享md5免费解密网站_哈客部落的博客-程序员信息网_md5解密

在一个md5解密交流群看到有人讨论MD5算法解密,消息有上百条,但是具体怎么解密却没人讨论。所以,今天就这个话题浅谈一下MD5摘要算法的几种解密方法,以及分享使用MD5免费解密网站如何进行md5加密解密,大家可要轻点喷。...

hive 表存储大小_Hive中文件存储格式及大小比较测试_逍遥Eric的博客-程序员信息网

在hive中创建表是有如下一个语句[ROW FORMAT row_format]row_format 的类型有如下:file_format:: SEQUENCEFILE| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)| RCFILE -- (Note: Available in H...

推荐文章

热门文章

相关标签