文章目录
A/B system是工作后接收的第一个模块,接近一年的时间,才算有所了解,被PL/PM催过无数次,也被客户的各种奇葩问题虐过。A/B system作为Android新推出的一个功能,网上资料很少,不然就是长篇大论扔代码的。所以想尽量写出易读易懂的文章,来快速的了解A/B system如何运作的。
- Android A/B system - bootctrl
- 启动的时候如何知道是加载slot A还是slot B
- Android A/B System - Generate OTA Package
- ota package(payload.bin)的结构
- ota package如何组织
- Android A/B system - update_engine
- 升级flow
Overview
A/B update又叫无缝升级,是Android提出的一种新的升级方式。可以简单理解为,内存中有两套系统(假设为A和B),你正在使用A,B在更新,你仍然可以使用,等B升级好了,再切换为B。
优点:
- 更新系统的时候不会影响用户的操作,不需要长时间的等待(因为有两套系统)
- 更新系统的时候不会刷成砖头(失败了可以回到原来的系统,系统中总是有一套可用的系统)
缺点:
- 因为有两套系统,所以占用更多的内存
- bootloader变复杂(在启动的时候要做A or B的判断等操作)
与传统OTA方式相比,A/B的变换:
- Partition(系统分区)
- A/B:两套分区(
slot A
slot B
) - Non-A/B:一套分区
- A/B:两套分区(
- Bootloader
- A/B:由boot control HAL控制
- Non-A/B:读取
misc
分区的信息,决定启动Android系统还是Recovery系统
- Build
- A/B:只有boot.img,没有recovery.img
- Non-A/B:boot.img和recovery.img
- Packages
- A/B与Non-A/B生成OTA包的工具和命令跟传统方式一样,但是生成内容的格式不一样了
Partition selection (slots)
Non-A/B System Partition
bootloader
boot
system
vendor
userdata
cache
recovery
misc
A/B System Partition
bootloader
boot_a
boot_b
system_a
system_b
vendor_a
vendor_b
userdata
misc
Common example scenarios
Ps:这一节参考Android A/B System OTA分析
slot A或slot B都有三个属性:
active
bootloader选择active属性的运行,排他属性,slot A或slot B有且仅有一个为activebootable
表示该分区是一个完整可以启动的系统successful
表明该分区在当前或上一次启动中可以正确运行
Common example scenarios
Normal case
系统当前运行在slot B,slot B当前具有active
bootable
successful
三个属性Update in progress
系统当前运行在slot B, slot B检测到slot A要升级,将slot A设为unbootable
,准备升级Update applied, reboot pending
slot A升级完成后,具有bootable
(此时还不知道是否升级成功),而且此时reboot后从slot A启动,所以slot A具有active
,slot B没有active
System rebooted into new update
成功启动后,当前运行系统为slot A,具有active
bootable
successful
三个属性,slot B仍然具有bootable
successful