Controllo delle versioni GKI

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ù release del kernel. Una release del kernel è legata a una sola versione del KMI. Nel 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, consulta Makefile del kernel Linux (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 AndroidRelease, la parte numerica è estratte dalla stringa per il confronto.

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. 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 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 un 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.

Determinazione della 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, ad esempio, numero build ci.android.com, numero di le patch sul 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 è specificato manualmente nel file manifest del dispositivo 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.