简介:

Android系统更新简而言之就是将升级包从服务器下载到本地然后对当前系统进行升级的过程,主要包括三大块:升级包、应用层、recovery层。

主要功能流程如下如所示:

  • 升级包:

版本编译完成后会生成target_file,这里的名称是:ota_target,升级包就是使用源版本的target_file跟目标版本的target_file通过imgdiff/bsdiff工具完成两个img文件的对比差分,做出升级所需的.new.dat、.patch.dat、.transfer.list文件,目录结构如下:

升级包解压后目录结构如下:

升级脚本和升级执行文件位于META-INF\com\google\android中

其中updater-script记录了升级时候需要执行的命令

update-binary则负责具体执行脚本中的命令语句

META-INFO下的CERT.RSA  CERT.SF MANIFEST.MF三个文件用于在recovery执行代码中的校验过程

.img.p文件为特定分区的镜像升级文件

.new.dat .patch.dat .transfer.list三个文件共同负责完成一个分区的升级,比如升级system分区的文件为:system.new.dat system.patch.dat system.transfer.list

其在升级脚本中的升级命令为:

block_image_update(map_partition("system"),package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||abort("E1001: Failed to update system image.");

升级包的编译命令为:

./build/tools/releasetools/ota_from_target_files -i source.zip target.zip ota.zip

Source.zip是源版本的targetfile,target.zip是目标版本的targetfile o,out.zip是生成的升级包文件名。

编译脚本build\tools\releasetools\ota_from_target_files.py

升级包编译大体流程如下图:

主要执行文件如下:

ota_from_target_files:主要的方法入口和控制逻辑都在这里

common:其中定义了很多需要用到的方法和子类,比如Options类,承载了很多设置项,信息字典的加载,patch的生成方法都在这里

blockimgdiff:生成增量升级文件

edify_generator: 生成update_script升级脚本

以编译增量包为例,生成增量包的WriteBlockIncrementalOTAPackage详细解释如下:

升级包编译完成后用于应用层的部署、下载、进入升级。

  • 应用层:

应用层主要包括三部分:服务器,OTA客户端,升级相关framework层。

服务器:主要作为升级包的远端下载仓库,处理客户端请求,下发升级包下载地址和升级包描述信息给客户端,这其中还包括一些运营策略,比如各种黑白名单,也兼有数据统计功能,一般各大厂商都会将系统更新客户端作为必备应用集成到系统分区中。

OTA客户端:客户端主要功能为定期请求服务器,检索可用更新,下载升级包后执行调用升级接口。单就OTA功能来说客户端逻辑其实非常简单,但是往往都为了确保发布版本的升级率会各大厂商都会做很多的运营策略,也就直接增加了客户端的功能与代码逻辑。

升级相关framework层:主要负责调用重启接口,将重启原因传入底层,写入misc启动命令

Framework中与升级相关的代码主要在如下类中:

RecoverySystem:包含升级相关方法

RecoverySystemService:包含读写bcb与uncrypt方法

Framework层主要升级流程如下:

Framework层最终的主要操作都集中在以下几句代码中:

SystemProperties.set("ctl.start", "setup-bcb");

SystemProperties.set("ctl.start", "uncrypt");

SystemProperties.set("sys.powerctl", "reboot," + reason); 这里reason值recovery

其中setup-bcb服务会将升级命令升级包地址写入到/misc分区中,在bootloader阶段,会根据该启动命令来决定是进入recovery系统还是进入android系统。

uncrypt涉及到data分区加密,会将位于data分区下的加密后的升级包进行解密,解密后以block.map的形式呈现。

修改属性通过init进程中的property_service来实现,这里会根据属性名称来确定是单纯的修改属性内容还是拉起对应的服务或者执行操作。

三、Recovery层:

升级操作的实现层是在recovery中,recovery下代码包含了多个子模块,几个重要的子模块如下:

Recovery_ui: 负责绘制recovery过程的界面显示

applypatch: 应用升级包中的patch文件进行升级,包括.p, .img, .data文件

bootloader_message: 读写启动loader启动命令,framework中调用到的setup-bcb最终就是在该模块下实现

edify: 一种新的脚本语言主要负责解释update_script升级脚本

install: 实现升级包的安装流程

recovery_ui、miniui:负责升级过程的升级界面展示

uncrypt:提供uncrypt、setup-bcb、clear-bcb三个服务实现读写bcb,解密升级包

updater : 升级包中的META-INF\com\google\android\update-binary就是该模块编译生成,负责执行升级包升级

Recovery下的执行流程如下图:

Recovery的主要流程可以概括为:

  1. 解密升级包,R版本改成了decryptFile方法来解密,之前旧版本是通过uncrypt服务来执行解密
  2. 校验升级包签名verify_package
  3. try_update_binary中调用update_binary可执行文件执行升级
  4. update_binary中解析update-script脚本执行升级命令
  5. 升级完成重启

try_update_binary简略代码如下:

update_binary由updater下的文件编译生成,主要负责执行具体的升级过程,其中解析升级脚本语言使用的是edify中定义的脚本语言,主函数中代码如下:

方法注册完成后脚本中的命令都可以找到对应的函数来处理,这样一来,update-script脚本中的语句每一行都可以被执行到:

比如脚本中有如下语句:

show_progress(0.650000, 0);

ui_print("Patching system image unconditionally...");

block_image_update("/dev/block/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat.br", "system.patch.dat") ||abort("E1001: Failed to update system image.");

对应的方法有:

对应执行的函数:ShowProgressFn,UIPrintFn,BlockImageUpdateFn

update_binary可执行文件运行完成后,会将结果返回给父进程recovery,然后recovery就会重启设备,这样一次系统更新就算是完成了。

android系统更新原理简介相关推荐

  1. Android渲染画面,Android系统图像渲染简介

    原标题:Android系统图像渲染简介 Android系统UI从绘制到显示至屏幕一般为如图过程:先从相应的图片解码获得位图数据放到内存.然后使用图形引擎将位图数据按一定方式,渲染到可用于显示的图形内存 ...

  2. 轻量级日志系统Loki原理简介和使用

    前言 这篇文章应朋友的要求,让写一篇loki日志系统,咱定义不容辞 一定要好好写 开干! 现实中的需求 公司的容器云运行的应用或某一个节点出现了问题,解决的思路 问题首先被prometheus监控 1 ...

  3. android 系统更新版本比较好,手机系统到底要不要更新 这里面有什么猫腻?

    手机系统要不要升级,这原本就不是个问题,有升级当然要升啦,难不成一直要用古董系统吗?但因为某两个国际大厂都有过故意让手机变慢的事情,所以人们对系统升级的怀疑越来越重,以至于有些人看到系统升级就心惊胆战 ...

  4. 在ipad上刷android系统更新,全自动刷安卓4.0 索尼SGPT111刷机教程

    1刷机前:无需自行准备ROM 给Android平板刷机,其实就是给平板电脑换一个新的操作系统.当然,这个操作系统还是Android系统,只是系统界面.内置应用等内容会与之前有所不同.现在网上有很多适用 ...

  5. 谷歌何时停止Android更新,谷歌Android系统更新模式即将发生变化

    谷歌已经有一段时间没有更新它的Android版本数据了,这让科技博客圈一片混乱.今年春天的时候,其也有5个月没有发布任何东西,然后在5月7日谷歌更新了它. 另外,谷歌可能已经切换到每两年发布一次的An ...

  6. lg 禁用android系统更新,LG 手机Android 11更新:部分最晚四季度才更新

    原标题:LG 手机Android 11更新:部分最晚四季度才更新 LG Velvet 和 LG V60 手机在韩国已经更新到了 Android 11,但据 LG 的德国网站上显示,部分解锁的 LG 手 ...

  7. 车载gps位置服务器,车载GPS监控系统工作原理简介

    随着经济的高速发展,汽车的社会拥有量急剧上升,各单位的车辆管理调配问题比较突出.与此同时,劫车.盗车等危害社会治安.影响社会稳定的各种现象逐年上升.车辆安全监控管理系统不但可以为有关单位及个人对其拥有 ...

  8. android系统更新视频播放器,基于的Android系统地视频播放器.doc

    本科毕业设计(论文) 基于Android系统的视频播放器Through the implementation of video player based on Android platform 致 谢 ...

  9. android IPC及原理简介

    什么是Android操作系统,所谓的Android:是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发. Linux系统 ...

最新文章

  1. c语言自定义char*函数返回值是乱码_[每日C语言」printf()函数的修饰符和返回值...
  2. ckeditor finder php,CKEDITOR CKFINDER的图片上传配置(C#/asp.net/php)
  3. IIS6.0限制上传文件大小的解决办法
  4. bzoj 1834: [ZJOI2010]network 网络扩容【最大流+最小费用最大流】
  5. SpringBoot学习笔记:Spring Data Jpa的使用
  6. 从0到1写RT-Thread内核——线程定义及切换的实现
  7. python while循环if_20170403Python控制流if、while、for语句学习
  8. WAS集群系列(5):集群搭建:步骤3:安装IHS软件
  9. 电平转换电路_RS232电平和TTL电平有什么不同?如何转换?
  10. 网络爬虫--抓取图片_vortex_新浪博客
  11. 爬虫—使用Requests
  12. UITableView的cell重用优化
  13. 同样的事情,小孩叫逆反,大人叫抬杠
  14. opencv java教程_详解OpenCV For Java环境搭建与功能演示
  15. 微电子科学与工程是否属于计算机类专业,微电子科学与工程专业属于什么门类...
  16. asp.net-DirectoryEntry基本操作入门
  17. 计算机桌面图标乱了,如何解决电脑桌面图标乱跑的问题
  18. BlockChain学习——Hash函数碰撞概率公式及其推导
  19. JavaScript学习记录十六
  20. 高德地图Amap常用功能总结

热门文章

  1. Java(SpringCloud) 使用Thymeleaf渲染模板,通过Mailgun发送邮件
  2. PNP问题学习笔记1
  3. 究极摸鱼挂科王终于击败了无敌可怕Vulkan大魔王
  4. linux中yum provide,linux之yum
  5. 转载maven版本更新
  6. 监控里的主码流和子码流是什么意思
  7. 浅谈Java对接阿里IOT
  8. cython代码编译和setup.py文件编写
  9. java set方法_Set的常用方法(java)
  10. matlab中ode指令,在Matlab中使用ODE选择步长