為了支援 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[.BC],例如 '12' 或 '12.0.0':
- 答:主要版本
- 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 := abc
生成com.android.build.boot.os_version -> 'abc'
-
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;