為支援 KeyMint (舊稱 Keymaster) 版本繫結,裝置啟動載入程式應提供每個分割區的作業系統 (OS) 版本和安全性修補程式等級。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 建構系統會分別使用下列格式表示 OS 版本和安全性修補程式。
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 4 的版本繫結建議從 boot.img
標頭中移除 os_version
。
為進行比較,本文也會說明從啟動映像檔標頭取得版本資訊的過時用法。請注意,啟動標頭中的 os_version
欄位會將 OS 版本和安全性修補程式等級合併為 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;