Schema di controllo delle versioni di GKI

Questa pagina descrive lo schema di controllo delle versioni per le immagini generiche del kernel (GKI). Un Generic Kernel Image (GKI) ha un identificatore univoco chiamato release del kernel. La release del kernel è composta dalla versione dell'interfaccia del modulo kernel (KMI) e dal sottolivello. Il kernel è specifica dell'immagine pubblicata, mentre la versione KMI rappresenta l'interfaccia da cui è 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 tabella seguente riassume i termini importanti utilizzati in questa pagina e per gli aggiornamenti di GKI.

Nome Simbolo Esempio Descrizione
Release del kernel w.x.y-zzz-k-suffix 5.4.42-android12-0-foo Identificatore univoco di 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 tabella seguente elenca altri termini correlati come riferimento.

Nome Simbolo Esempio Descrizione
w.x.y 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. È anche comunemente indicato come numero di versione in tre parti. Il termine utilizzato in VINTF, versione del kernel, potrebbe causare confusione con altri termini, in particolare w.

Questa variabile è indicata come kernel_version_tuple in libkver.

Questa tupla non deve essere diminuita da aggiornamenti, OTA o principale.

Ramo kernel zzz-l.x android12-5.4 Questo termine viene utilizzato in Tipi di branch del kernel comuni.
Versione w 5 Questo termine non è utilizzato in questo documento. Questa variabile è indicata come 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

Si tratta del numero della release di Android (dessert) a cui è associato il kernel.

Quando confronti il campo AndroidRelease, la parte numerica viene estratta dalla stringa per il confronto.

Il numero della release di Android non deve essere diminuito da alcun aggiornamento, inclusi quelli OTA o principali.

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 al KMI all'interno della stessa release di Android, viene aumentata una generazione di KMI.

Il numero di generazione del KMI inizia con 0.

Progettazione del controllo delle versioni

Release del kernel

Definizione

Per i dispositivi forniti con 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 la sezione Determinare la release del kernel da un 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. Ai fini di questo documento, il suffisso dopo la generazione del file 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. Per l'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 la stessa interfaccia del modulo kernel. I DLKM compatibili con un dispositivo sono compatibili anche l'una dall'altra.

La versione KMI non deve essere diminuita da eventuali aggiornamenti OTA.

Livello secondario

Il livello secondario y descrive l'ordine di rilascio delle release del kernel all'interno della stessa versione KMI.

Per due release del kernel con la stessa versione KMI, ma con i sottolivelli Y1 e Y2 rispettivamente:

  • Se Y1 è minore o uguale a Y2, un dispositivo che esegue Y1 può ricevere un update a Y2.
  • Se Y1 è maggiore di Y2, un dispositivo con 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 lo snippet di codice seguente:

std::string get_kernel_release() {
  struct utsname buf;
  return uname(&buf) == 0 ? buf.release : "";
}

Un esempio di output è:

5.4.42-android12-0-00544-ged21d463f856

Ai fini di questo documento, tutto ciò che segue la generazione del file KMI viene ignorato durante 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 il numero di build di ci.android.com, il numero di patch sul kernel di riferimento e gli hash SHA del commit Git.

Librkver

La libreria libkver fornisce un'interfaccia C++ per analizzare la release del kernel o una stringa di versione KMI. Per un elenco delle API esposte da libkver, consulta 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 in genere non cambiano, non è necessario codificare k all'interno della matrice di compatibilità. Tuttavia, nell'improbabile caso in cui il requisito di configurazione del kernel debba essere modificato, assicurati di quanto segue:

  • Il requisito corrispondente dalla matrice di compatibilità viene rimosso.
  • Vengono aggiunti ulteriori test VTS per verificare i nuovi requisiti condizionali alla generazione di KMI.

Versione dell'immagine di avvio nei metadati OTA

Anche se l'immagine di avvio viene aggiornata tramite un aggiornamento OTA, deve essere incapsulata nel formato del payload OTA, payload.bin. Il payload OTA codifica un version campo 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 nei metadati OTA è chiamato boot image version.

Poiché il ramdisk viene sempre creato da zero, l'utilizzo del timestamp del ramdisk è 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 come qualsiasi altra partizione.