Schéma de gestion des versions GKI

Cette page décrit le système de gestion des versions pour les images génériques du noyau (GKI). Une image générique du noyau (GKI) possède un identifiant unique appelé "version du noyau". La version du noyau se compose de la version de l'interface du module du noyau (KMI) et du sous-niveau. La version du noyau est spécifique à l'image publiée, tandis que la version KMI représente l'interface à partir de laquelle une version est créée. Une version KMI peut être compatible avec plusieurs versions du noyau. Une version du noyau n'est associée qu'à une seule version de l'IKM. Dans le cas peu probable où l'interface du module du noyau doit être modifiée, la génération de l'IKM est itérée pour refléter la modification de la version de l'IKM.

Résumé des conditions d'utilisation

Le tableau suivant récapitule les termes importants utilisés sur cette page et pour les mises à jour de l'image du noyau GKI.

Nom Symbole Exemple Description
Version du noyau w.x.y-zzz-k-suffix 5.4.42-android12-0-foo Identifiant unique d'une version GKI. Il s'agit de la valeur renvoyée par uname.
Version du KMI w.x-zzz-k 5.4-android12-0 Décrit l'interface du module de noyau (KMI) entre GKI et les modules de noyau à chargement dynamique (DLKM).
Sous-niveau y 42 Décrit l'ordre de publication des versions du noyau au sein d'une même version KMI.

Le tableau suivant liste d'autres termes associés à titre de référence.

Nom Symbole Exemple Description
w.x.y w.x.y 5.4.42

Pour en savoir plus, consultez Linux Kernel Makefiles (recherchez "KERNELRELEASE").

w.x.y est utilisé directement tout au long de ce document. Il s'agit également de ce que l'on appelle communément le numéro de version en trois parties. Le terme utilisé dans VINTF, version du noyau, peut être confondu avec d'autres termes, en particulier w.

Cette variable est appelée kernel_version_tuple dans libkver.

Ce tuple ne doit pas être réduit par les mises à jour, y compris OTA ou mainline.

Branche du noyau zzz-w.x android12-5.4 Ce terme est utilisé dans Types de branches de noyau courants.
Version z 5 Ce terme n'est pas utilisé dans ce document. Cette variable est appelée version dans libkver.
Niveau de correctif x 4 Ce terme n'est pas utilisé dans ce document. Cette variable est appelée patch_level dans libkver.
Version d'Android zzz android12

Il s'agit du numéro de version Android (dessert) auquel le noyau est associé.

Lorsque vous comparez le champ AndroidRelease, la partie numérique est extraite de la chaîne pour la comparaison.

Le numéro de version d'Android ne doit pas être réduit par les mises à jour, y compris les mises à jour OTA ou mainline.

Génération de KMI k 0

Il s'agit d'un nombre supplémentaire ajouté pour faire face à des événements peu probables. Si un correctif de bug de sécurité nécessite des modifications du KMI au sein de la même version d'Android, une génération de KMI est incrémentée.

Le numéro de génération du KMI commence par 0.

Conception de la gestion des versions

Version du noyau

Définition

Pour les appareils fournis avec GKI, la version du noyau est définie comme suit :

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

Pour en savoir plus, consultez Déterminer la version du noyau à partir d'un appareil.

Voici un exemple de version du noyau.

5.4.42-android12-0-00544-ged21d463f856

Description

La version du noyau est l'ID unique d'une version GKI. Si deux binaires GKI ont la même version du noyau, ils doivent être identiques au niveau des octets.

Une version du noyau se compose d'une version KMI, d'un sous-niveau et d'un suffixe. Dans le cadre de ce document, le suffixe après la génération de KMI est ignoré.

Version du KMI

Définition

La version du KMI est définie comme suit :

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

Notez que le sous-niveau y ne fait pas partie de la version KMI. Pour l'exemple de la section Release du kernel, la version KMI est la suivante :

5.4-android12-0

Description

La version KMI décrit l'interface du module de noyau (KMI) entre GKI et les modules de noyau à chargement dynamique (DLKM).

Si deux versions du noyau ont la même version KMI, elles implémentent la même interface de module du noyau. Les DLKM compatibles avec l'un le sont également avec l'autre.

La version KMI ne doit pas être réduite par les mises à jour OTA.

Sous-niveau

Le sous-niveau y décrit l'ordre de publication des versions du noyau au sein de la même version KMI.

Pour deux versions du noyau ayant la même version KMI, mais avec des sous-niveaux Y1 et Y2 respectivement :

  • Si Y1 est inférieur ou égal à Y2, un appareil exécutant Y1 peut recevoir une mise à jour vers Y2.
  • Si Y1 est supérieur à Y2, un appareil exécutant Y1 ne peut pas être mis à jour vers Y2.

En d'autres termes, si la version KMI ne change pas, le sous-niveau ne doit pas être réduit par une mise à jour OTA.

Déterminer la version du noyau à partir d'un appareil

Vous trouverez la version complète du noyau en exécutant uname -r ou uname(2) avec l'extrait de code suivant :

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

Voici un exemple de résultat :

5.4.42-android12-0-00544-ged21d463f856

Pour les besoins de ce document, tout ce qui suit la génération du KMI est ignoré lors de l'extraction des informations du noyau. Plus formellement, la sortie de uname -r est analysée avec l'expression régulière suivante (en supposant que zzz commence toujours par "android") :

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

Les informations ignorées peuvent inclure des informations telles que le numéro de build ci.android.com, le nombre de correctifs au-dessus du noyau de base et les hachages SHA du commit Git.

libkver

La bibliothèque libkver fournit une interface C++ pour analyser la version du noyau ou une chaîne de version KMI. Pour obtenir la liste des API exposées par libkver, consultez packages/modules/Gki/libkver/include/kver.

Vérifications VINTF

Pour Android 11 ou version antérieure, la partie de la version KMI correspondant à la version d'Android est spécifiée manuellement dans le fichier manifeste de l'appareil par les fabricants d'appareils. Pour en savoir plus, consultez Règles de correspondance du noyau VINTF.

À partir d'Android S, la partie de la version KMI correspondant à la version d'Android peut être extraite du noyau et injectée dans le fichier manifeste de l'appareil au moment de la compilation.

Étant donné que les exigences de configuration du noyau ne changent généralement pas, il n'est pas nécessaire d'encoder k dans la matrice de compatibilité. Toutefois, dans le cas peu probable où la configuration du noyau doit être modifiée, assurez-vous des points suivants :

  • L'exigence correspondante de la matrice de compatibilité est supprimée.
  • Des tests VTS supplémentaires sont ajoutés pour vérifier les nouvelles exigences conditionnelles à la génération de KMI.

Version de l'image de démarrage dans les métadonnées OTA

Même si l'image de démarrage est mise à jour via une mise à jour OTA, elle doit être encapsulée dans le format de charge utile OTA, payload.bin. La charge utile OTA encode un champ version pour chaque partition. Lorsque update_engine gère une charge utile OTA, il compare ce champ pour s'assurer que la partition n'est pas rétrogradée.

Pour éviter toute confusion, le champ version de la partition de démarrage dans les métadonnées OTA est appelé boot image version.

Étant donné que le ramdisk est toujours créé à partir de zéro, l'utilisation du code temporel du ramdisk suffit à décrire l'intégralité de l'image de démarrage. Il n'est pas nécessaire d'encoder la version du noyau dans la version de l'image de démarrage, sauf si vous assemblez une ancienne image de démarrage à un nouveau binaire du noyau à l'avenir.

Avant une mise à jour OTA, le client OTA vérifie la version de l'image de démarrage de la même manière que pour toute autre partition.