虚拟A / B概述
Android具有两种更新机制:A / B(无缝)更新和非A / B更新。为了降低代码复杂性并增强可更新性,Android 11统一了这两种机制。新的更新机制虚拟A / B通过在不降低存储成本的情况下对所有设备进行无缝更新来结合两个前辈的优势。
- 虚拟A / B更新与A / B更新一样是无缝的。虚拟A / B更新可最大程度地减少设备离线和不可用的时间。
- 虚拟A / B更新可以回滚。如果新操作系统无法启动,则设备会自动回滚到以前的版本。
- 虚拟A / B更新通过仅复制引导加载程序使用的分区来使用最少的额外空间。其他可更新分区已快照。
背景
本节介绍一些支持虚拟A / B的术语和技术。
设备映射器
设备映射器是Android中经常使用的Linux虚拟块层。对于动态分区, /system
类的分区是分层设备的堆栈:
- 堆栈的底部是物理超级分区(例如,
/dev/block/by-name/super
)。 - 中间是
dm-linear
设备,用于指定超级分区中的哪些块形成给定分区。这表现为/dev/block/mapper/system_[a|b]
的A / B设备上,或/dev/block/mapper/system
的非A / B设备上。 - 最后,为验证的分区创建了
dm-verity
设备。该设备验证dm-linear
设备上的块是否正确签名。它显示为/dev/block/mapper/system-verity
并且是/system
挂载点的来源。
这是/system
挂载点下的堆栈图。
图1. / system挂载点下的堆栈
dm快照概述
虚拟A / B依赖于dm-snapshot
,这是一个用于映射存储设备状态的设备映射器模块。使用dm-snaphot
,有四个设备正在播放:
- 基本设备是被快照的设备。在此页面上,基本设备始终是动态分区,例如系统或供应商。
- 写入时复制(COW)设备用于将更改记录到基本设备。它可以是任何大小,但必须足够大以容纳对基本设备的所有更改。
- 快照设备是使用
snapshot
目标创建的。写入快照设备将写入COW设备。从快照设备读取是从基本设备读取还是从COW设备读取,具体取决于快照是否更改了所访问的数据。 - 使用
snapshot-origin
目标创建原始设备。读取直接从基本设备读取的原始设备。写入原始设备直接写入基本设备,但是通过写入COW设备备份原始数据。
图2. dm快照的设备映射
参考资料:Android 开源项目 | Android Open Source Project https://source.android.google.cn/ (可能要爬梯子)