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 屬性。 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。

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