Gestion des versions GKI

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Cette page décrit le schéma de gestion des versions pour les images génériques du noyau (GKI). Une image générique du noyau (GKI) a un identifiant unique appelé la version du noyau. La version du noyau comprend la version de l'interface du module du noyau (KMI) et le sous-niveau. La version du noyau est spécifique à l'image en cours de publication, tandis que la version KMI représente l'interface à partir de laquelle une version est construite. Une version de KMI peut prendre en charge plusieurs versions de noyau. Une version du noyau est liée à une seule version de KMI. Dans le cas peu probable où l'interface du module du noyau doit être modifiée, la génération de KMI est itérée pour refléter le changement de version de KMI.

Résumé des termes

Le tableau suivant résume les termes importants utilisés sur cette page et pour les mises à jour de GKI.

Nom Symbole Exemple La description
Version du noyau wxy-zzz-k-suffixe 5.4.42-android12-0-foo Identificateur unique d'une version GKI. Il s'agit de la valeur renvoyée par uname .
Version KMI wx-zzz-k 5.4-android12-0 Décrit l'interface du module de noyau (KMI) entre GKI et les modules de noyau chargeables dynamiquement (DLKM).
Sous-niveau y 42 Décrit l'ordre de publication des versions du noyau dans la même version de KMI.

Le tableau suivant répertorie d'autres termes connexes à titre de référence.

Nom Symbole Exemple La description
wxy wxy 5.4.42

Pour plus de détails, voir Makefiles du noyau Linux (recherchez "KERNELRELEASE").

wxy est utilisé directement dans ce document. Il est également communément appelé numéro de version en trois parties . Le terme utilisé dans VINTF, version du noyau , peut prêter à confusion avec d'autres termes, en particulier w .

Cette variable est appelée kernel_version_tuple dans libkver .

Ce tuple ne doit être diminué par aucune mise à jour, y compris OTA ou mainline.

Branche du noyau zzz-wx Android12-5.4 Ce terme est utilisé dans les types de branches du noyau commun .
Version w 5 Ce terme n'est pas utilisé dans ce document. Cette variable est appelée version dans libkver .
Niveau de patch X 4 Ce terme n'est pas utilisé dans ce document. Cette variable est appelée patch_level dans libkver .
Version Android zzz Android12

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

Lors de la comparaison du champ AndroidRelease , la partie numérique est extraite de la chaîne à des fins de comparaison.

Le numéro de version d'Android ne doit être diminué par aucune mise à jour, y compris OTA ou mainline.

Génération KMI k 0

Il s'agit d'un numéro supplémentaire ajouté pour faire face à des événements improbables. Si un correctif de bogue de sécurité nécessite des modifications du KMI dans la même version d'Android, une génération de KMI est augmentée.

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

Conception de version

Version du noyau

Définition

Pour les appareils livrés 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 plus d'informations, consultez Détermination de la version du noyau à partir d'un périphérique .

Voici un exemple de version du noyau.

5.4.42-android12-0-00544-ged21d463f856

La description

La version du noyau est l'ID unique d'une version GKI. Si deux fichiers 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. Pour les besoins de ce document, le suffixe après la génération de KMI est ignoré.

Version KMI

Définition

La version 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 dans la version du noyau , la version de KMI est :

5.4-android12-0

La description

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

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

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

Sous-niveau

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

Pour deux versions de noyau qui ont la même version de KMI mais qui ont respectivement les sous-niveaux Y1 et Y2 :

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

Autrement dit, si la version KMI ne change pas, le sous-niveau ne doit pas être diminué par une mise à jour OTA.

Détermination de la version du noyau à partir d'un périphérique

La version complète du noyau peut être trouvée 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 : "";
}

Un exemple de sortie est :

5.4.42-android12-0-00544-ged21d463f856

Pour les besoins de ce document, tout élément après la génération de 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 une liste des API exposées par libkver, voir packages/modules/Gki/libkver/include/kver .

Contrôles VINTF

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

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

É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é. Cependant, dans le cas peu probable où les exigences de configuration du noyau doivent être modifiées, assurez-vous que :

  • 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 de 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 de version de la partition de démarrage dans les métadonnées OTA est appelé boot image version .

Étant donné que le disque virtuel est toujours construit à partir de zéro, l'utilisation de l' horodatage du disque virtuel est suffisante pour 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, à moins que vous n'alliez 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 n'importe quelle autre partition.