為了支持 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。
默認情況下,構建系統只會為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 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;