Schema di controllo delle versioni di GKI

Questa pagina descrive lo schema di controllo delle versioni per le immagini del kernel generiche (GKI). Un'immagine del kernel generico (GKI) ha un identificatore univoco chiamato versione del kernel. La release del kernel è costituita dalla versione dell'interfaccia del modulo kernel (KMI) e dal sublevel. La release del kernel è specifica per l'immagine rilasciata, mentre la versione KMI rappresenta l'interfaccia da cui viene creata una release. Una versione KMI può supportare più release del kernel. Una release del kernel è associata a una sola versione KMI. Nell'improbabile eventualità in cui l'interfaccia del modulo del kernel debba essere modificata, la generazione di KMI viene iterata per riflettere la modifica della versione KMI.

Riepilogo dei termini

La tabella seguente riassume i termini importanti utilizzati in questa pagina e per gli aggiornamenti del GKI.

Nome Simbolo Esempio Descrizione
Release kernel w.x.y-zzz-k-suffix 5.4.42-android12-0-foo Identificatore univoco per una release del GKI. Questo è il valore restituito da uname.
Versione KMI w.x-zzz-k 5.4-android12-0 Descrive l'interfaccia del modulo kernel (KMI) tra GKI e i moduli kernel caricabili dinamicamente (DLKM).
Sublevel y 42 Descrive l'ordine di rilascio delle versioni del kernel all'interno della stessa versione KMI.

La tabella seguente elenca altri termini correlati a titolo di riferimento.

Nome Simbolo Esempio Descrizione
w.x.y w.x.y 5.4.42

Per maggiori dettagli, consulta Linux Kernel Makefiles (cerca "KERNELRELEASE").

w.x.y viene utilizzato direttamente in questo documento. Questo valore è 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 è denominata kernel_version_tuple in libkver.

Questa tupla non deve essere ridotta da alcun aggiornamento, inclusi OTA o mainline.

Ramo del kernel zzz-w.x android12-5.4 Questo termine viene utilizzato in Tipi comuni di rami del kernel.
Versione w 5 Questo termine non viene utilizzato in questo documento. Questa variabile è denominata version in libkver.
Livello patch x 4 Questo termine non viene utilizzato in questo documento. Questa variabile è indicata come patch_level in libkver.
Release di Android zzz android12

Questo è il numero di versione di Android (nome di un dolce) a cui è associato il kernel.

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

Il numero di versione di Android non deve essere ridotto da aggiornamenti, inclusi OTA o mainline.

Generazione di KMI k 0

Si tratta di un numero aggiuntivo aggiunto per gestire eventi improbabili. Se una correzione di bug di sicurezza richiede modifiche alla KMI all'interno della stessa versione di Android, viene aumentata una generazione di KMI.

Il numero di generazione del KMI inizia con 0.

Progettazione del controllo delle versioni

Release 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, vedi Determinare la versione 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 la stessa release del kernel, devono essere identici byte per byte.

Una release del kernel è costituita da una versione KMI, un livello secondario e un suffisso. Ai fini di questo documento, il suffisso dopo la generazione del KMI viene ignorato.

Versione KMI

Definizione

La versione dell'indicatore chiave di misurazione è definita come segue:

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

Tieni presente che il sottolivello y non fa parte della versione KMI. Per l'esempio in Release kernel, la versione KMI è:

5.4-android12-0

Descrizione

La versione KMI descrive l'interfaccia del modulo kernel (KMI) tra GKI e i moduli kernel caricabili dinamicamente (DLKM).

Se due release del kernel hanno la stessa versione KMI, implementano la stessa interfaccia del modulo del kernel. Le DLKM compatibili con una sono compatibili anche con l'altra.

La versione del KMI non deve essere ridotta da nessun aggiornamento OTA.

Sublevel

Il sottolivello, 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 livelli secondari Y1 e Y2 rispettivamente:

  • Se Y1 è minore o uguale a Y2, un dispositivo che esegue Y1 può ricevere un aggiornamento a Y2.
  • Se Y1 è maggiore di Y2, un dispositivo con Y1 non può essere aggiornato a Y2.

ovvero, se la versione KMI non cambia, il livello secondario non deve essere ridotto da nessun aggiornamento OTA.

Determinare la versione del kernel da un dispositivo

La versione completa del kernel può essere trovata 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 del KMI viene ignorato durante l'estrazione delle informazioni sul kernel. Più formalmente, l'output di uname -r viene analizzato con la seguente espressione regolare (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 come il numero di build ci.android.com, il numero di patch sul kernel di base e gli hash SHA del commit Git.

libkver

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 versione KMI relativa alla release di Android viene specificata manualmente nel manifest del dispositivo dai produttori di dispositivi. Per i dettagli, vedi Regole di corrispondenza del kernel VINTF.

A partire da Android S, la parte della release di Android della versione KMI può essere estratta dal kernel e inserita nel manifest del dispositivo al momento della compilazione.

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 sia necessario modificare il requisito di configurazione del kernel, assicurati che:

  • Il requisito corrispondente della matrice di compatibilità viene rimosso.
  • Vengono aggiunti test VTS aggiuntivi 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 inserita nel formato del payload OTA, payload.bin. Il payload OTA codifica un campo version per ogni partizione. Quando update_engine gestisce un payload OTA, confronta questo campo per assicurarsi che la partizione non venga sottoposta a downgrade.

Per evitare confusione, il campo version per la partizione di avvio nei metadati OTA è denominato boot image version.

Poiché il ramdisk viene sempre creato da zero, l'utilizzo del timestamp 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 in futuro non unisci una vecchia immagine di avvio a un nuovo 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.