为了支持 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[.B.C],例如 12
或 12.0.0
- A:主版本
- B:次版本,如果不存在,则默认为零
- C:子次版本,如果不存在,则默认为零
com.android.build.${partition}.security_patch
的格式为 YYYY-MM-DD。
默认情况下,构建系统为 system
、system_ext
和 product
分区生成 com.android.build.${partition}.security_patch
。设备制造商应为非系统分区设置 BOOT_SECURITY_PATCH
、VENDOR_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 开始,每个设备构建都可以为操作系统版本设置自定义值,该版本可以被设备引导加载程序识别。例如
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 位无符号整数。并且此机制假定所有镜像将一起更新,这在 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;