Android OTA升级原理和流程分析(四)---Android系统Recovery模式的工作原理
Android OTA升级原理和流程分析(四)—Android系统Recovery模式的工作原理
在使用update.zip包升级时怎样从主系统(main system)重启进入Recovery模式,进入Recovery模式后怎样判断做何种操作,以及怎样获得主系统发送给Recovery服务的命令,这一系列问题的解决是通过整个软件平台的不同部分之间的密切通信配合来完成的。为此,我们必须要了解Recovery模式的工作原理,这样才能知道我们的update.zip包是怎样一步步进入Recovery中升级并最后到达主系统的。
1、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的消息。
2、Recovery模式中的两个通信接口
在Recovery服务中上述的三个实体之间的通信是必不可少的,他们相互之间又有以下两个通信接口。
1)、通过CACHE分区中的三个文件与mian system 通信:
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的信息。作用不详。
2)、通过BCB(Bootloader Control Block)与bootloader 通信:
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>”
3、如何从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服务的细节流程
文件参考:
1、Android OTA升级原理和流程分析(四)—Android系统Recovery模式的工作原理
http://blog.csdn.net/LOVE000520/article/details/51818670
智能推荐
Android——View的工作原理
View的工作原理 文章目录 View的工作原理 1.1 ViewRoot和DecorView简介 1.1.1 ViewRoot相关 1.1.2 DecorView相关 1.2 理解MeasureSpec 1.2.1 MeasureSpec 1.2.2 MeasureSpec和LayoutParams的对应关系 1.3 View的工作流程 1.3.1 measure过程 1.3.2 layout过...
android uevent的工作原理
Uevent是Linux/Android驱动模型的一部分,当设备添加或者删除时通知用户空间的一种统一方式。 Uevent在内核空间如何发送到用户空间 uevent模块使用起来比较简单,就是设备状态改变的时候,调用kobject_uevent系列的api即可,具体实现在可查看源码。 简单画了个流程图: 这部分网上总结的人也很多,可参看下面几个连接: Uevent发送(热插拔)事件到用户空间 Linu...
Android 动画的工作原理
在android系统中动画分为两种分别是基础动画和属性动画。对于动画的工作原理主要涉及到的是基础动画和属性动画的实现。 本章主要分两大块:基础动画和属性动画 1.基础动画 对于基础动画的实现主要是嵌套在View的绘制流程中的,基础动画主要有旋转RotatleAnimation,缩放ScaleAnimation,透明AlphaAnimation,平移TranslateAnimation等都是Anim...
Android系统的JNI原理分析(二)
声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结。 本文参考了一些书籍的若干章节,比如《Android进阶解密-第9章-JNI原理》、《深入理解Android虚拟机-第4章-分析JNI》、《深入理解Android系统-第2章-分析JNI》、《Android NDK Beginner_'s Guide》等 之所以会参考这么多书籍的原因是我在看某一技术问题时,习惯参考不同...
Android系统的JNI原理分析(一)
声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结。 本文参考了一些书籍的若干章节,比如《Android进阶解密-第9章-JNI原理》、《深入理解Android虚拟机-第4章-分析JNI》、《深入理解Android系统-第2章-分析JNI》、《Android NDK Beginner_'s Guide》等 之所以会参考这么多书籍的原因是我在看某一技术问题时,习惯参考不同...
猜你喜欢
Android View 工作原理
介绍View的工作原理之前,先来介绍一些基础的概念,以便后面详细的介绍View的三大流程:measure、layout和draw。 1.ViewRoot和DecorView ViewRoot具体对应的类是ViewRootImpl,该类是链接WindowManager与DecorView的纽带,View的三大流程都是通过ViewRoot来完成的。ActivityThread中,Activity被创建...
学会对VUE的SEO优化,你的网站总是排在前面
在开始之前,我们先来了解一下什么是SEO。 SEO(Search Engine Optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。目的是让其在行业内占据领先地位,获得品牌收益。很大程度上是网站经营者的一种商业行为,将自己或自己公司的排名前移。 说白了就是你的SEO做的越好,当别人搜索某个关键词时,你的网站在搜索结果中就排的越靠前。这...
Mac升级10.15 Catalina,根目录无权限 完美解决办法!
方法一:不完美重启失效 进入安全模式 重启按command+R 使用命令关闭sip 进入命令控制台:csrutil disable 重新启动电脑 命令台:csrutil status 查看sip状态 sudo mount -uw / killall Finder sudo mkdir -p /export/Logs cd /export/ sudo -s sud...
【Unity】协程原理与线程的区别
说到协程,我们首先回顾以下线程与进程这两个概念。在操作系统(os)级别,有进程(process)和线程(thread)两个我们看不到但又实际存在的“东西”,这两个东西都是用来模拟“并行”的,写操作系统的程序员通过用一定的策略给不同的进程和线程分配CPU计算资源,来让用户“以为”几个不同的事情在“同时”进...
在linux系统中编译ARM版EasyNTS上云网关服务报undefined错误的解决方案
我们大部分的视频平台都编译了Arm版本,EasyNVS的ARM版本:视频流媒体服务器综合管理平台能否实现ARM版的编译、EasyNVR的ARM版本:如何在ARM系统将视频流媒体服务器输出RTSP流并实现统一管理,以上两篇博客大家都可以作为参考。 问题分析 由于EasyNTS上云网关也在编译ARM平台的服务,所以在linux中要实现交叉编译,但是执行编译命令之后就会出现undfined ** 的错误...
