AVB 屬性中的版本資訊

為支援 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_slot_verify() 這些資料都儲存在 AvbSlotVerifyData** out_data 輸出參數

版本資訊的預設格式

根據預設,Android 建構系統會為 OS 採用下列格式 版本和安全修補程式

com.android.build.${partition}.os_version 的格式為 A[.B.C], 例如 1212.0.0

  • A:主要版本
  • B:次要版本;如果沒有,則預設為 0
  • C:副次要版本,沒有時會預設為 0

com.android.build.${partition}.security_patch 的格式為 YYYY-MM-DD。

根據預設,建構系統會產生 systemcom.android.build.${partition}.security_patchsystem_extproduct 分區。裝置製造商是 應設定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 位元無正負號整數。這項機制會假設所有映像檔都會產生 更新的內容,且在 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;