Per supportare il binding della versione di KeyMint (in precedenza Keymaster), il bootloader del dispositivo deve fornire la versione del sistema operativo e il livello della patch di sicurezza per ogni partizione. La versione del sistema operativo e il livello della patch di sicurezza sono due coppie chiave-valore distinte nelle proprietà AVB. Ad esempio:
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'
Il bootloader del dispositivo può ottenere queste proprietà AVB da un'immagine vbmeta utilizzando
avb_property_lookup()
.
avb_slot_verify()
può caricare più immagini vbmeta e vengono archiviate nel parametro di output AvbSlotVerifyData**
out_data
.
Il formato predefinito delle informazioni sulla versione
Per impostazione predefinita, il sistema di compilazione Android utilizza il seguente formato per la versione del sistema operativo e la patch di sicurezza, rispettivamente.
Il formato di com.android.build.${partition}.os_version
è A[.B.C],
ad esempio 12
o 12.0.0
:
- A: versione principale
- B: versione secondaria, il valore predefinito è zero in caso di assenza
- C: versione secondaria, il valore predefinito è zero in caso di assenza
Il formato di com.android.build.${partition}.security_patch
è AAAA-MM-GG.
Per impostazione predefinita, il sistema di build genera
com.android.build.${partition}.security_patch
per le partizioni system
, system_ext
e product
. Il produttore del dispositivo
dovrebbe impostare BOOT_SECURITY_PATCH
, VENDOR_SECURITY_PATCH
e altre
patch per le partizioni non di sistema. Ad esempio:
BOOT_SECURITY_PATCH := 2022-01-05
generacom.android.build.boot.security_patch -> '2022-01-05'
VENDOR_SECURITY_PATCH := 2022-02-05
generacom.android.build.vendor.security_patch -> '2022-02-05'
Il produttore del dispositivo può impostare *_SECURITY_PATCH
su
$(PLATFORM_SECURITY_PATCH)
se aggiorna sempre tutte le partizioni alla versione con lo stesso livello di patch di sicurezza.
BOOT_SECURITY_PATCH := $(PLATFORM_SECURITY_PATCH)
VENDOR_SECURITY_PATCH := $(PLATFORM_SECURITY_PATCH)
Specificare informazioni sulla versione personalizzate
A partire da Android 13, ogni build del dispositivo può avere un valore personalizzato per la versione del sistema operativo che può essere riconosciuto dal bootloader del dispositivo. Ad esempio:
SYSTEM_OS_VERSION := 12.0.0
generacom.android.build.system.os_version -> '12.0.0'
BOOT_OS_VERSION := a.b.c
generacom.android.build.boot.os_version -> 'a.b.c'
VENDOR_OS_VERSION := 12.0.1
generacom.android.build.vendor.os_version -> '12.0.1'
Le informazioni sulla versione obsoleta nell'intestazione dell'immagine di avvio
In Android 9 e versioni successive, il
binding della versione
di Keymaster 4 suggerisce di rimuovere os_version
dall'intestazione boot.img
.
A scopo di confronto, qui viene descritto anche l'utilizzo obsoleto dell'ottenimento delle informazioni sulla versione dall'intestazione dell'immagine di avvio. Tieni presente che il campo
os_version
nell'intestazione di avvio combina la versione del sistema operativo e il livello patch di sicurezza in
un numero intero senza segno a 32 bit. Questo meccanismo presuppone che tutte le immagini vengano
aggiornate insieme, il che è obsoleto dopo la modularizzazione delle partizioni in
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;