AVB 属性中的版本信息

为了支持 Keymaster版本绑定,设备引导加载程序需要为每个分区提供操作系统 (OS) 版本和安全补丁级别。操作系统版本和安全补丁级别是AVB 属性中的两个单独的键 -> 值对。例如,

  • com.android.build.system.os_version -> '12'
  • com.android.build.system.security_patch -> '2022-02-05'
  • com.android.build.vendor.os_version -> '12'
  • com.android.build.vendor.security_patch -> '2022-02-05'
  • com.android.build.boot.os_version -> '12'
  • com.android.build.boot.security_patch -> '2022-02-05'

设备引导加载程序可以通过avb_property_lookup()从 vbmeta 映像中获取这些 AVB 属性。 avb_slot_verify()可以加载多个 vbmeta 图像,并将存储在AvbSlotVerifyData** out_data输出参数中。

版本信息的默认格式

默认情况下,Android 构建系统将分别使用以下格式的操作系统版本和安全补丁。

com.android.build.${partition}.os_version的格式为 A[.BC],例如 '12' 或 '12.0.0':

  • A:主要版本
  • B:次要版本,不存在时默认为零
  • C:次小版本,不存在时默认为零

com.android.build.${partition}.security_patch的格式是 YYYY-MM-DD。

默认情况下,构建系统只会为systemsystem_extproduct分区生成com.android.build.${partition}.security_patch 。设备制造商应为非系统分区设置BOOT_SECURITY_PATCHVENDOR_SECURITY_PATCH等。例如,

  • BOOT_SECURITY_PATCH := 2022-01-05生成
    • com.android.build.boot.security_patch -> '2022-01-05'
  • VENDOR_SECURITY_PATCH := 2022-02-05生成
    • com.android.build.vendor.security_patch -> '2022-02-05'

如果设备制造商总是将所有分区更新到具有相同安全补丁级别的版本,则设备制造商可以将*_SECURITY_PATCH设置为$(PLATFORM_SECURITY_PATCH)

  • BOOT_SECURITY_PATCH := $(PLATFORM_SECURITY_PATCH)
  • VENDOR_SECURITY_PATCH := $(PLATFORM_SECURITY_PATCH)

引导映像标头中的过时版本信息

从 Android 9 开始,Keymaster版本绑定建议从boot.img标头中删除os_version

为了比较,这里还描述了从引导映像头获取版本信息的过时用法。请注意,引导标头中的os_version字段将操作系统版本和安全补丁级别组合成一个 32 位无符号整数。并且这种机制假设所有的镜像都会一起更新,在Project Treble中分区模块化后已经过时了。

// Operating system version and security patch level.
// For version "A.B.C" and patch level "Y-M-D":
//   (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M)
//   A = os_version[31:25]
//   B = os_version[24:18]
//   C = os_version[17:11]
//   Y = 2000 + os_version[10:4]
//   M = os-version[3:0]

uint32_t os_version;