Android 10 支持动态分区,这是一种可以在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小的用户空间分区系统。
本页介绍了如何在搭载动态分区支持的 A/B 设备更新期间调整动态分区的大小(针对搭载 Android 9 及更低版本的设备)。
背景
        设备上有一个 super 分区。此分区没有槽后缀。块设备必须与 fstab 中 /misc 的 blk_device 条目一起存在。例如,如果 fstab 文件列出了以下内容:      
/dev/block/bootdevice/by-name/misc /misc # Other fields
        然后,禁止的设备super必须位于/dev/block/bootdevice/by-name/super,但super该分区不需要列在fstab文件。
      
        super 分区中有两个元数据插槽,编号分别为 0 和 1,对应于分区的 A/B 插槽。在本文档中,我们将元数据槽位称为元数据 S(源)和元数据 T(目标)。类似地,将分区命名为 system_s、vendor_t 等。
      
        在升级之前,元数据 S 包含正在使用的动态分区(通常是 system_s、vendor_s、product_s 等)的信息。系统会在更新期间读取这些分区的范围,因此它们无法删除。
      
分区属于更新组。如需了解详情,请参阅实现动态分区。
下面的示例显示了设备上的元数据。
- 元数据 0
          - 群组 foo_a- 分区 system_a
- 分区 product_services_a
- 其他由 Foo 更新的分区
 
- 分区 
- 组 - bar_a
- 分区 vendor_a
- 分区 product_a
- 其他由 Bar 更新的分区
 
- 分区 
- “foo_b”组(从上一次升级中剩余)
- “bar_b”组(从上一次升级中剩余)
 
- 群组 
- 元数据 1
          - “foo_a”组(从上一次升级中剩余)
- “bar_a”组(从上一次升级中剩余)
- 群组 foo_b- 分区 system_b
- 分区 product_services_b
- 其他由 Foo 更新的分区
 
- 分区 
- 群组 bar_b- 分区 vendor_b
- 分区 product_b
- 其他由 Bar 更新的分区
 
- 分区 
 
- “
        您可以使用 lpdump 工具(system/extras/partition_tools 下的源代码)转储设备上的元数据。例如:
      
lpdump --slot 0 /dev/block/bootdevice/by-name/superlpdump --slot 1 /dev/block/bootdevice/by-name/super
更新流程
- 初始化 super分区元数据。- 从元数据 S 加载来源动态分区的范围。假设 M 是加载的元数据。
- 从 M 中移除目标组和分区(例如 foo_t、bar_t),以便 M 仅包含带有_s后缀的分区和组。
- 
              根据更新清单中的 dynamic_partition_metadata字段添加目标组和分区。
 可在new_partition_info中找到每个分区的大小。
- 将元数据 M 写入元数据 T。
- 将设备映射器上添加的分区映射为可写入。
 
- 在块设备上应用更新。
          - 根据需要在设备映射器上将源分区映射为只读分区。这对于旁加载来说是必要的,因为在更新之前未映射来源分区。
- 将完整或增量更新应用到目标插槽上的所有块设备。
- 装载分区以运行安装后脚本,然后再卸载分区。
 
- 取消映射目标分区。
在更新之前和之后,以下系统属性应具有相应的值:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
将组和分区添加到更新清单
在具有动态分区的 A/B 设备或要添加对动态分区的支持的 A/B 设备上执行 OTA 更新时,您需要将组和分区添加到更新清单中。以下代码段显示更新清单以支持动态分区的其他信息。要查看有关每个字段的详细文档,请参阅 update_metadata.proto。
message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}
message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}
message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}