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 属性。多个 vbmeta 映像可以通过 avb_slot_verify() 加载,并且会存储在 AvbSlotVerifyData** out_data 输出参数中。

版本信息的默认格式

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

com.android.build.${partition}.os_version 的格式为 A[.B.C],例如 1212.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 13 开始,每个设备 build 都可以有一个设备引导加载程序可识别的自定义操作系统版本值。例如:

  • SYSTEM_OS_VERSION := 12.0.0 生成
    • com.android.build.system.os_version -> '12.0.0'
  • BOOT_OS_VERSION := a.b.c 生成
    • com.android.build.boot.os_version -> 'a.b.c'
  • VENDOR_OS_VERSION := 12.0.1 生成
    • com.android.build.vendor.os_version -> '12.0.1'

启动映像头文件中过时的版本信息

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

作为对比,这里也介绍了从启动映像头文件中获取版本信息的过时用法。请注意,启动头文件中的 os_version 字段将操作系统版本和安全补丁级别合并成了一个 32 位无符号整数。此机制假定所有映像都将一起更新,而在 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;