当前位置:   article > 正文

android动态分区AB升级,Android A/B 系统升级简介

android init对虚拟ab升级的支持

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

来源:https://pengzhangdev.github.io/Android-AB-system-update/

顾名思义, A/B系统就是指终端设备上存在两套系统,(userdata只有一份, 被两套系统共用). 简单来讲, 可以理解为, 存在一套系统分区, 一套备份分区, 两套系统都可以被启动, 两套系统的版本号可以一样, 也可以一套旧, 一套新. 而升级就是将旧的系统升级到新版本.

A/B系统实现了无缝升级(Seamless System Updates), 存在如下特点:终端设备在出厂时有两套设备可以工作, 在升级出现异常或者出错时, 始终确保系统存在一套设备可以正常工作.

系统在后台进行升级, 更新到另一套系统, 用户不会被打断. 在更新完成后, 用户在下次重启手机时, 就会进入新系统.

在 dm-verity 或者其他校验方式检测到系统顺坏或异常后, 可以重启回到升级前的系统, 确保用户使用不受影响.

Android8.0的代码编译时, 在BoardConfig有对应的选项来控制是编译成A/B系统还是正常单系统. 由于新系统跟原来的OTA升级系统存在大不同, 导致无法通过以前的OTA升级方式(安全地)升级到A/B系统.

而A/B系统升级, 是由运行于Android后台的update_engine和 slot a, slot b两套系统共同完成. 在启动其中一套系统的情况下, update_engine在后台与服务器通信下载升级流并更新到另一套系统.

A/B 系统升级主要涉及如下4个方面:分区选择(slots), 即选择哪个系统.

update_engine, 即升级流下载和升级

bootloader交互, 即如何通知bootloader切换slot

ota包生成.

分区选择¶

分区表和分区内容变化¶

详细内容请参考 Android8 分区表和分区相关操作. 这里简单总结下分区表上跟单系统的差异.

这里以boot,system, vendor和modem存在两套系统为例子, 其余分区按照最小分区表.单系统分区表A/B系统分区表功能描述bootloaderbootloader引导linux系统

miscmiscAndroid系统与recovery, bootloade通信的数据

boot-存放Android的kernel和ramdisk

-boot_a存放Android的kernel和单系统中recovery的ramdisk

-boot_b存放Android的kernel和单系统中recovery的ramdisk

system-Android系统应用, 库和资源文件.

-system_a存放单系统boot中的ramdisk和system中的应用, 库和资源文件

-system_b存放单系统boot中的ramdisk和system中的应用, 库和资源文件

-vendor_a存放厂商的配置, 可执行程序, 库, 目录结构与/system/一致

-vendor_b存放厂商的配置, 可执行程序, 库, 目录结构与/system/一致

cache-临时存放数据, 通常临时存放下载, 备份和升级包

recovery-存放recovery系统的kernel和ramdisk

userdatauserdata存放用户数据

所谓的A/B系统分区, 就是在原有分区名字后吗添加_a 和 _b, 在刷机, 或者系统启动的时候, 根据bootloader的参数添加后缀, 选择正确的系统. misc分区在A/B系统中变成一个可有可无的存在, 因为其功能只是传递恢复出厂设置的参数, 而recovery的功能也只剩下恢复出厂设置, 所以, 本质上, 没必要再基于misc传递参数了.

系统分区属性¶

bootloader为了判断一个系统(slot)是否为可以启动的状态, 需要为其定义对应的属性(状态). 其状态说明如下:active. 活动分区标识, 排他, 代表该分区为启动分区, bootloader总会选择该分区.

bootable. 表示该slot的分区存在一套可能可以启动的系统.

successful. 表示该slot的系统能正常启动.

unbootable. 代表该分区损坏的, 无法启动, 在升级过程总被标记, 该标记等效于以上标记被清空. 而active标记会将该标记清空.

slot a 和 slot b, 只有一个是active, 它们可以同时有 bootable 和 successful 属性.

Android-AB-system-update-1.pngbootloader检测到1个或者2个slot都是bootable的状态.

选择active的slot或者选择successful的slot进行尝试启动.

启动成功的标记是, dm-verity 成功.

由于启动成功, 则该slot被标记为successful和active

由于启动失败, 则设置该slot为unbootable, 并设置另一个slot为active, 进行下一次尝试.

Android-AB-system-update-2.png

升级流下载和升级¶

首先, 我们看下升级包的内容. 在A/B升级的情况下, 升级包内容如下:

Path = aosp_marlin-ota-eng.builder.zip

Type = zip

Comment = signed by SignApk

Physical Size = 384694679

Date Time Attr Size Compressed Name

------------------- ----- ------------ ------------ ------------------------

2009-01-01 00:00:00 ..... 360 360 META-INF/com/android/metadata

2009-01-01 00:00:00 ..... 107 107 care_map.txt

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/576267
推荐阅读
相关标签
  

闽ICP备14008679号