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[.B.C],例如 1212.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 13 開始,每個裝置版本都可以有 OS 版本的自訂值,可供裝置系統啟動載入程式辨識。例如:

  • 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 欄位會將 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;