Questa pagina descrive lo schema di controllo delle versioni per le immagini generiche del kernel (GKI). R Immagine del kernel generica (GKI) ha un identificatore univoco chiamato release del kernel. La release del kernel è composta della versione dell'interfaccia del modulo del kernel (KMI) e del livello secondario. Il kernel è specifica dell'immagine pubblicata, mentre la versione KMI rappresenta l'interfaccia da cui viene creata una release. Una versione KMI può supportare di più versioni del kernel. Una release del kernel è legata a una sola versione del KMI. Nella l'improbabile evento in cui l'interfaccia del modulo del kernel debba essere modificata, il KMI per riflettere la modifica nella versione KMI.
Riepilogo dei termini
La seguente tabella riassume i termini importanti utilizzati in questa pagina e per aggiornamenti GKI.
Nome | Simbolo | Esempio | Descrizione |
---|---|---|---|
Release kernel | w.x.y-zzz-k-suffisso | 5.4.42-android12-0-foo | Identificatore univoco per una release GKI. Questo è il valore
restituito da uname . |
Versione KMI | lx-zzz-k | 5,4-android12-0 | Descrive l'interfaccia del modulo del kernel (KMI) tra GKI e moduli kernel (DLKM) caricabili dinamicamente. |
Livello secondario | y | 42 | Descrive l'ordine di rilascio delle release del kernel all'interno della la stessa versione del KMI. |
La seguente tabella elenca altri termini correlati come riferimento.
Nome | Simbolo | Esempio | Descrizione |
---|---|---|---|
l.x.a | l.x.a | 5.4.42 |
Per maggiori dettagli, vedi Linux Makefile del kernel (cerca "KERNELRELEASE"). w.x.y viene utilizzato direttamente in questo documento. Questo valore è anche noto anche come numero di versione in tre parti. Il termine utilizzato in VINTF, la versione kernel, potrebbe creare confusione con altri termini, in particolare W. Questa variabile è denominata kernel_version_tuple in libkver. Questa tupla non deve essere diminuita da aggiornamenti, OTA o principale. |
Ramo kernel | zzz-l.x | Android 12-5.4 | Questo termine è utilizzato in Tipi di ramo del kernel comuni. |
Versione | w | 5 | Questo termine non è utilizzato in questo documento. Questa variabile è denominata version in libkver. |
Livello patch | x | 4 | Questo termine non è utilizzato in questo documento. Questa variabile è denominata patch_level in libkver. |
Release di Android | zzz | Android12 |
Questo è il numero di release di Android (dessert) a cui è associato il kernel con.
Quando confronti il campo Il numero di release Android non deve essere diminuito di alcun aggiornamento, ad esempio OTA o principale. |
Generazione di KMI | k | 0 |
Si tratta di un numero aggiuntivo aggiunto per gestire eventi. Se la correzione di un bug di sicurezza richiede modifiche all'KMI nello stesso Release di Android, è stata aumentata una generazione di KMI. Il numero di generazione KMI inizia con 0. |
Progettazione del controllo delle versioni
Release kernel
Definizione
Per i dispositivi dotati di GKI, la release del kernel è definita come segue:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
Per ulteriori informazioni, consulta Determinazione della release del kernel da una dispositivo.
Di seguito è riportato un esempio di release del kernel.
5.4.42-android12-0-00544-ged21d463f856
Descrizione
La release del kernel è l'ID univoco di una release GKI. Se due file binari GKI hanno nella stessa release del kernel, devono essere identici a livello di byte.
Una release del kernel è composta da una versione KMI, un livello secondario e un suffisso. Per ai fini del presente documento, il suffisso dopo la generazione di KMI viene ignorato.
Versione KMI
Definizione
La versione KMI è definita come segue:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
Tieni presente che il livello secondario y
non fa parte della versione KMI. Ad esempio
Nella release del kernel, la versione KMI è:
5.4-android12-0
Descrizione
La versione KMI descrive l'interfaccia del modulo del kernel (KMI) tra GKI e moduli kernel (DLKM) caricabili dinamicamente.
Se due release del kernel hanno la stessa versione KMI, implementano lo stesso kernel dell'interfaccia del modulo. I DLKM compatibili con un dispositivo sono compatibili anche l'una dall'altra.
La versione KMI non deve essere diminuita da aggiornamenti OTA.
Livello secondario
Il livello secondario, y
, descrive l'ordine di rilascio delle release del kernel all'interno della classe
la stessa versione del KMI.
Per due release kernel che hanno la stessa versione KMI ma hanno il livello secondario Y1 e Y2:
- Se Y1 è minore o uguale a Y2, un dispositivo che esegue Y1 può ricevere aggiorna a Y2.
- Se Y1 è maggiore di Y2, un dispositivo che esegue Y1 non può essere aggiornato a Y2.
Vale a dire, se la versione KMI non cambia, il livello secondario non deve essere diminuito da qualsiasi aggiornamento OTA.
Determinare la release del kernel da un dispositivo
La release completa del kernel è disponibile eseguendo uname -r
, o
uname(2)
con il seguente snippet di codice:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
Un output di esempio è:
5.4.42-android12-0-00544-ged21d463f856
Ai fini di questo documento, tutto ciò che segue la generazione KMI viene ignorato
per l'estrazione delle informazioni del kernel. Più formalmente, l'output di uname -r
è
analizzata con la seguente regex
(supponendo che zzz inizi sempre con "android"):
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
Le informazioni ignorate possono includere informazioni quali numero build ci.android.com, numero di le patch sopra il kernel di base e gli hash SHA del commit git.
Librkver
La libreria, libkver, fornisce un'interfaccia C++ per analizzare la release del kernel o un
Stringa della versione KMI. Per un elenco delle API esposte da libkver, vedi
packages/modules/Gki/libkver/include/kver
Controlli VINTF
Per Android 11 o versioni precedenti, la parte della release KMI relativa alla release Android è specificate manualmente nel relativo file manifest dai produttori. Per maggiori dettagli, consulta le regole di corrispondenza del kernel VINTF.
Da Android S, è possibile estrarre la parte della versione KMI relativa alla release di Android dal kernel e inseriti nel manifest del dispositivo in fase di build.
Poiché i requisiti di configurazione del kernel generalmente non cambiano,
devono codificare k
all'interno della matrice di compatibilità. Tuttavia, nell'improbabile
nel caso in cui il requisito di configurazione del kernel debba essere modificato, assicurati
le seguenti:
- Il requisito corrispondente dalla matrice di compatibilità viene rimosso.
- Vengono aggiunti ulteriori test VTS per controllare condizionali i nuovi requisiti sulla generazione di KMI.
Versione immagine di avvio nei metadati OTA
Anche se l'immagine di avvio viene aggiornata tramite un aggiornamento OTA, deve essere
aggregato nel formato di payload OTA, payload.bin
. Il payload OTA codifica un
version
per ogni partizione. Quando update_engine
gestisce un payload OTA,
confronta questo campo per garantire che non venga eseguito il downgrade della partizione.
Per evitare confusione, il campo version
per la partizione di avvio nell'OTA
i metadati sono chiamati boot image version
.
Poiché il ramdisk viene sempre creato da zero, utilizzando il comando timestamp sia sufficiente per descrivere l'intera immagine di avvio. Non è necessario codificare la release del kernel nella versione dell'immagine di avvio, a meno che tu non stia eseguendo lo stitching di una avviare l'immagine in un nuovo programma binario del kernel.
Prima di un aggiornamento OTA, il client OTA controlla la versione dell'immagine di avvio allo stesso modo di qualsiasi altra partizione.