GKI-Versionierung

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Auf dieser Seite wird das Versionierungsschema für generische Kernel-Images (GKIs) beschrieben. Ein generisches Kernel-Image (GKI) hat eine eindeutige Kennung, die Kernel-Version genannt wird. Das Kernel-Release besteht aus der Version der Kernel-Modul-Schnittstelle (KMI) und der Unterebene. Die Kernel-Version ist spezifisch für das veröffentlichte Image, während die KMI-Version die Schnittstelle darstellt, aus der eine Version erstellt wird. Eine KMI-Version kann mehrere Kernel-Releases unterstützen. Ein Kernel-Release ist nur an eine KMI-Version gebunden. In dem unwahrscheinlichen Fall, dass die Schnittstelle des Kernelmoduls geändert werden muss, wird die KMI-Generierung wiederholt, um die Änderung der KMI-Version widerzuspiegeln.

Zusammenfassung der Begriffe

Die folgende Tabelle fasst wichtige Begriffe zusammen, die auf dieser Seite und für GKI-Updates verwendet werden.

Name Symbol Beispiel Beschreibung
Kernel-Veröffentlichung wxy-zzz-k-Suffix 5.4.42-android12-0-foo Eindeutiger Bezeichner für eine GKI-Version. Dies ist der von uname zurückgegebene Wert.
KMI-Version wx-zzz-k 5.4-android12-0 Beschreibt die Kernelmodulschnittstelle (KMI) zwischen GKI und dynamisch ladbaren Kernelmodulen (DLKM).
Unterebene j 42 Beschreibt die Release-Reihenfolge von Kernel-Releases innerhalb derselben KMI-Version.

In der folgenden Tabelle sind weitere verwandte Begriffe als Referenz aufgeführt.

Name Symbol Beispiel Beschreibung
wxy wxy 5.4.42

Einzelheiten finden Sie unter Linux-Kernel-Makefiles (suchen Sie nach „KERNELRELEASE“).

wxy wird in diesem Dokument direkt verwendet. Dies wird allgemein auch als dreiteilige Versionsnummer bezeichnet. Der in VINTF verwendete Begriff Kernel-Version kann zu Verwechslungen mit anderen Begriffen führen, insbesondere mit w .

Diese Variable wird in libkver als kernel_version_tuple bezeichnet.

Dieses Tupel darf nicht durch Updates, einschließlich OTA oder Mainline, verringert werden.

Kernel-Zweig zzz-wx android12-5.4 Dieser Begriff wird in allgemeinen Kernel-Zweigtypen verwendet .
Ausführung w 5 Dieser Begriff wird in diesem Dokument nicht verwendet. Diese Variable wird in libkver als Version bezeichnet.
Patch-Level x 4 Dieser Begriff wird in diesem Dokument nicht verwendet. Diese Variable wird in libkver als patch_level bezeichnet.
Android-Version zzz Android12

Dies ist die Versionsnummer von Android (Dessert), mit der der Kernel verknüpft ist.

Beim Vergleich des AndroidRelease -Felds wird der numerische Teil zum Vergleich aus der Zeichenfolge extrahiert.

Die Android-Versionsnummer darf nicht durch Updates verringert werden, einschließlich OTA oder Mainline.

KMI-Generation k 0

Dies ist eine zusätzliche Zahl, die hinzugefügt wird, um mit unwahrscheinlichen Ereignissen umzugehen. Wenn eine Sicherheitsfehlerbehebung Änderungen am KMI innerhalb derselben Android-Version erfordert, wird eine KMI-Generation erhöht.

Die KMI-Generierungsnummer beginnt mit 0.

Versionierungsdesign

Kernel-Veröffentlichung

Definition

Für Geräte, die mit GKI ausgeliefert werden, ist die Kernel-Version wie folgt definiert:

KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w      .x         .y       -zzz           -k            -something

Weitere Informationen finden Sie unter Ermitteln der Kernel-Version von einem Gerät .

Das Folgende ist ein Beispiel für eine Kernel-Version.

5.4.42-android12-0-00544-ged21d463f856

Beschreibung

Die Kernel-Version ist die eindeutige ID einer GKI-Version. Wenn zwei GKI-Binärdateien dieselbe Kernel-Version haben, müssen sie byteweise identisch sein.

Eine Kernel-Version besteht aus einer KMI-Version, einer Unterebene und einem Suffix. Für die Zwecke dieses Dokuments wird das Suffix nach der KMI-Generierung ignoriert.

KMI-Version

Definition

Die KMI-Version ist wie folgt definiert:

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

Beachten Sie, dass die Unterebene y nicht Teil der KMI-Version ist. Für das Beispiel in Kernel-Release lautet die KMI-Version:

5.4-android12-0

Beschreibung

Die KMI-Version beschreibt die Kernel-Modul-Schnittstelle (KMI) zwischen GKI und dynamisch ladbaren Kernel-Modulen (DLKM).

Wenn zwei Kernel-Releases dieselbe KMI-Version haben, implementieren sie dieselbe Kernel-Modulschnittstelle. Die mit dem einen kompatiblen DLKMs sind auch mit dem anderen kompatibel.

Die KMI-Version darf durch keine OTA-Updates verringert werden.

Unterebene

Die Unterebene y beschreibt die Release-Reihenfolge von Kernel-Releases innerhalb derselben KMI-Version.

Für zwei Kernel-Versionen, die dieselbe KMI-Version haben, aber die Unterebenen Y1 bzw. Y2 haben:

  • Wenn Y1 kleiner oder gleich Y2 ist, kann ein Gerät, auf dem Y1 ausgeführt wird, ein Update auf Y2 erhalten.
  • Wenn Y1 größer als Y2 ist, kann ein Gerät, auf dem Y1 ausgeführt wird, nicht auf Y2 aktualisiert werden.

Das heißt, wenn sich die KMI-Version nicht ändert, darf die Unterebene durch kein OTA-Update verringert werden.

Kernel-Release von einem Gerät bestimmen

Die vollständige Kernel-Version finden Sie, indem Sie uname -r oder uname(2) mit dem folgenden Code-Snippet ausführen:

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

Eine Beispielausgabe ist:

5.4.42-android12-0-00544-ged21d463f856

Für die Zwecke dieses Dokuments wird alles nach der KMI-Generierung beim Extrahieren von Kernel-Informationen ignoriert. Formaler wird die Ausgabe von uname -r mit der folgenden Regex geparst (vorausgesetzt, zzz beginnt immer mit „android“):

^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$

Die ignorierten Informationen können Informationen wie die Build-Nummer von ci.android.com , die Anzahl der Patches über dem Basiskernel und SHA-Hashes des Git-Commits enthalten.

libkver

Die Bibliothek libkver bietet eine C++-Schnittstelle zum Analysieren der Kernel-Version oder einer KMI-Versionszeichenfolge. Eine Liste der von libkver bereitgestellten APIs finden Sie unter packages/modules/Gki/libkver/include/kver .

VINTF-Prüfungen

Für Android 11 oder niedriger wird der Android-Release-Teil der KMI-Version manuell im Gerätemanifest von den Geräteherstellern angegeben. Einzelheiten finden Sie unter VINTF-Kernel-Match-Regeln .

Von Android S kann der Android-Release-Teil der KMI-Version aus dem Kernel extrahiert und zur Build-Zeit in das Gerätemanifest eingefügt werden.

Da sich die Kernel-Konfigurationsanforderungen im Allgemeinen nicht ändern, ist es nicht erforderlich, k innerhalb der Kompatibilitätsmatrix zu codieren. Stellen Sie jedoch in dem unwahrscheinlichen Fall, dass die Kernel-Konfigurationsanforderung geändert werden muss, Folgendes sicher:

  • Die entsprechende Anforderung aus der Kompatibilitätsmatrix wird entfernt.
  • Zusätzliche VTS-Tests werden hinzugefügt, um die neuen Anforderungen in Abhängigkeit von der KMI-Generierung zu überprüfen.

Boot-Image-Version in OTA-Metadaten

Selbst wenn das Boot-Image über OTA aktualisiert wird, muss es in das OTA-Payload-Format payload.bin . Die OTA-Nutzdaten kodieren ein version für jede Partition. Wenn update_engine eine OTA-Nutzlast verarbeitet, vergleicht es dieses Feld, um sicherzustellen, dass die Partition nicht herabgestuft wird.

Um Verwirrung zu vermeiden, heißt das version für die Boot-Partition in den OTA-Metadaten boot image version .

Da die Ramdisk immer von Grund auf neu erstellt wird, reicht die Verwendung des Ramdisk-Zeitstempels aus, um das gesamte Boot-Image zu beschreiben. Es ist nicht erforderlich, die Kernel-Version in der Boot-Image-Version zu codieren, es sei denn, Sie heften in Zukunft ein altes Boot-Image an eine neue Kernel-Binärdatei.

Vor einem OTA-Update überprüft der OTA-Client die Boot-Image-Version auf die gleiche Weise wie jede andere Partition.