Noyaux Android courants

Les noyaux communs AOSP (également appelés noyaux communs Android ou ACK) sont en aval des noyaux kernel.org et incluent des correctifs intéressants pour la communauté Android qui n'ont pas été fusionnés dans les noyaux principaux ou LTS (Long Term Supported). Ces correctifs peuvent inclure les suivants:

  • Backports et sélections de fonctionnalités en amont nécessaires pour les fonctionnalités Android
  • Fonctionnalités prêtes pour les appareils Android, mais toujours en cours de développement en amont
  • Fonctionnalités des fournisseurs/OEM utiles aux autres partenaires de l'écosystème

android-mainline est la branche de développement principale pour les fonctionnalités Android. La ligne principale Linux est fusionnée dans android-mainline chaque fois que Linus Torvalds publie une version ou une version candidate. Avant 2019, les noyaux courants Android étaient construits en clonant le noyau LTS récemment déclaré et en ajoutant les correctifs spécifiques à Android. Ce processus a changé en 2019 pour créer une branche du nouveau kernel commun Android à partir de android-mainline. Ce nouveau modèle évite les efforts importants de transfert de port et de test des correctifs Android en obtenant le même résultat de manière incrémentielle. android-mainline est soumis à des tests continus importants. Ce modèle garantit un noyau de haute qualité dès le jour de sa publication.

Lorsqu'une nouvelle version LTS est déclarée en amont, le noyau commun correspondant est dérivé de android-mainline. Cela permet aux partenaires de commencer un projet avant la déclaration de la version LTS, en fusionnant à partir de android-mainline. Une fois la nouvelle branche du kernel commune créée, les partenaires peuvent facilement remplacer la source de fusion par la nouvelle branche.

Les autres branches de kernel courantes reçoivent des fusions régulières de leur kernel LTS associé. Ces fusions sont normalement effectuées immédiatement après la publication de la version LTS. Par exemple, lorsque Linux 6.1.75 a été publié, il a été fusionné dans le kernel commun 6.1 (android14-6.1). Les partenaires sont vivement encouragés à mettre à jour leurs kernels pour rester à jour avec les correctifs de bugs LTS et spécifiques à Android.

Branche du kernel KMI ACK

Les noyaux GKI disposent d'une interface de kernel module stable. Le KMI est identifié de manière unique par la version du kernel et la version de la plate-forme Android. Les branches sont donc nommées ANDROID_RELEASE-KERNEL_VERSION. Par exemple, le kernel GKI 6.1 pour Android 14 est nommé android14-6.1. Pour Android 15, le noyau GKI android15-6.6 a été introduit.

Créer et lancer des noyaux

Avant Android 15, n'importe lequel des trois noyaux les plus récents pouvait être utilisé pour le lancement de l'appareil. À partir d'Android 15, les deux versions de kernel les plus récentes peuvent être utilisées pour le lancement de l'appareil. Les noyaux de lancement pour Android 15 sont android15-6.6 et android14-6.1.

Étant donné que les mises à niveau du noyau ne sont pas requises lors de la mise à jour d'une version de plate-forme, les noyaux qui ne disposent pas des dernières fonctionnalités d'une version de plate-forme peuvent tout de même être utilisés pour lancer des appareils. Par conséquent, les noyaux conçus pour Android 14, comme android14-6.1, peuvent être utilisés sur les appareils même après la mise à niveau de la version de la plate-forme vers Android 15.

Version de la plate-forme Android Kernels de lancement Noyaux de fonctionnalités
Android 15 (2024) android15-6.6
android14-6.1
android15-6.6
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

1 Des restrictions supplémentaires peuvent s'appliquer si le BSP associé a été mis à jour pour la version de la plate-forme. Plus généralement, le numéro de version Android du noyau doit être supérieur ou égal à la version FCM cible. Pour en savoir plus, consultez la section Objet d'interface fournisseur – Faire correspondre les branches du noyau.

Hiérarchie de noyau courante

Brancher à partir de la branche android-mainline

Le niveau supérieur de la hiérarchie de noyau commune est illustré dans la figure 1.

Créer des noyaux communs à partir du noyau android-mainline

Figure 1 : Créer des noyaux communs à partir du noyau android-mainline

Notez qu'un nouveau kernel commun Android android14-6.1 a été dérivé de android-mainline en 2022. En 2023, lors de la déclaration de la prochaine version LTS, android15-6.6 a été ramifié à partir de android-mainline.

Comme illustré dans la figure 1, chaque version de kernel peut servir de base à deux kernels GKI. Par exemple, les deux noyaux de la version 5.15 sont android13-5.15 et android14-5.15, qui sont tous deux des noyaux de fonctionnalités pour leurs versions de plate-forme respectives. Cela a également été le cas pour la version 5.10. android12-5.10 a été créé lorsque la version LTS a été déclarée, et android13-5.10 a été dérivé de android12-5.10 au stade de la finalisation des fonctionnalités du kernel au printemps 2021 pour permettre le développement de fonctionnalités pour Android 13. À partir d'Android 15 (2024), il n'y a qu'un seul nouveau kernel GKI par version de kernel (il n'y a pas de kernel android15-6.1).

Cycle de vie des branches KMI ACK

Le cycle de vie d'une branche KMI ACK est illustré ci-dessous dans la figure 2.

6.6 Cycle de vie des branches KMI ACK

Figure 2. 6.6 Cycle de vie des branches KMI ACK

Pour clarifier le processus de développement et le cycle de vie des branches, la figure 2 se concentre sur les branches KMI ACK pour la version 6.6.

Chaque branche du KMI ACK passe par trois phases, indiquées dans la figure 2 par des couleurs différentes dans chaque branche. Comme indiqué, la fusion du LTS est effectuée régulièrement, quelle que soit la phase.

Phase de développement

Lorsqu'elle est créée, une branche KMI ACK entre dans la phase de développement (étiquetée dev dans la figure 2) et est ouverte aux contributions de fonctionnalités pour la prochaine version de la plate-forme Android. Dans la figure 2, android15-6.6 a été créé lorsque la version 6.6 a été déclarée comme nouveau noyau LTS en amont.

Phase de stabilisation

Lorsque la branche KMI ACK est déclarée complète, elle entre dans la phase de stabilisation (étiquetée stable dans la figure 2). Les fonctionnalités partenaires et les corrections de bugs sont toujours acceptées, mais le suivi KMI est activé pour détecter les modifications qui affectent l'interface. Au cours de cette phase, les modifications destructives pour les KMI sont acceptées et la définition des KMI est mise à jour à une fréquence prédéfinie (normalement toutes les deux semaines). Pour en savoir plus sur la surveillance des KMI, consultez la présentation de GKI.

Phase de figement du KMI

Avant le transfert d'une nouvelle version de plate-forme vers AOSP, la branche ACK KMI est gelée et reste figée pendant toute la durée de vie de la branche. Cela signifie qu'aucune modification ne sera acceptée si elle interrompt le KMI, sauf si un problème de sécurité grave est identifié et qu'il ne peut pas être atténué sans affecter le KMI stable. Pour éviter les problèmes de KMI, certains correctifs fusionnés à partir de LTS peuvent être modifiés ou supprimés si le correctif n'est pas requis pour les appareils Android.

Lorsqu'une branche KMI ACK est figée, les corrections de bugs et les fonctionnalités des partenaires peuvent être acceptées tant que le noyau commun KMI existant n'est pas endommagé. Le KMI peut être étendu avec de nouveaux symboles exportés, à condition que les interfaces comprenant le KMI actuel ne soient pas affectées. Lorsque de nouvelles interfaces sont ajoutées au KMI, elles deviennent immédiatement stables et ne peuvent pas être endommagées par de futures modifications.

Par exemple, une modification qui ajoute un champ à une structure utilisée par un noyau commun d'interface KMI n'est pas autorisée, car elle modifie la définition de l'interface:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

Toutefois, vous pouvez ajouter une fonction:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

Pendant la durée de vie du noyau GKI, la rétrocompatibilité avec l'espace utilisateur est maintenue afin que le noyau puisse être utilisé en toute sécurité pour la version de la plate-forme Android avec laquelle l'appareil a été lancé. Des tests continus avec les versions précédentes garantissent le maintien de la compatibilité. Dans la figure 2, le kernel android15-6.6 peut donc être utilisé pour les appareils Android 15 et versions ultérieures. Comme la version de la plate-forme Android est également compatible avec les versions précédentes, le noyau android14-6.1 peut être utilisé pour les appareils Android 15 à des fins de lancement ou de mise à niveau.

Numéro de génération du KMI

En cas de fusion LTS pendant la phase de stabilisation, ou en cas de problème de sécurité ou d'autre événement nécessitant l'acceptation d'un correctif modifiant le KMI, le numéro de génération du KMI enregistré dans build.config.common est incrémenté. Vous pouvez trouver la génération de KMI actuelle à l'aide de la commande uname:

$ uname -r
6.6.30-android15-6-g86d10b30f51f

Le nombre qui suit la version de la plate-forme correspond à la génération de la KMI (6 dans ce cas).

Si la génération de KMI change, le noyau n'est pas compatible avec les modules du fournisseur conformes à la génération précédente de KMI. Les modules doivent donc être recréés et mis à jour de manière synchrone avec le noyau. Une fois le KMI congelé, les modifications de génération de KMI devraient être très rares.

Compatibilité entre les noyaux

Les exigences de compatibilité entre les noyaux de la même famille LTS changent à partir des nouveaux noyaux GKI.

Kernels GKI

Les noyaux GKI conservent la rétrocompatibilité avec toutes les versions de la plate-forme Android compatibles avec la version du noyau. De plus, les versions de la plate-forme Android sont rétrocompatibles avec les noyaux GKI des versions précédentes. Vous pouvez donc utiliser en toute sécurité le kernel android14-6.1 développé pour Android 14 (2023) sur les appareils équipés d'Android 15 (2024). La compatibilité est vérifiée par des tests VTS et CTS continus des noyaux GKI avec toutes les versions compatibles.

Le KMI est stable, ce qui permet de mettre à jour le noyau sans avoir à recompiler les modules du noyau dans l'image du fournisseur.

La compatibilité KMI n’est pas maintenue entre les différents noyaux GKI. Par exemple, un kernel android14-6.1 ne peut pas être remplacé par un kernel android15-6.6 sans recompiler tous les modules.

Les noyaux GKI ne sont compatibles qu'avec leur version initiale et les versions suivantes. Elles ne sont pas compatibles avec les versions antérieures. Par conséquent, un kernel android15-6.6 n'est pas compatible avec les appareils exécutant Android 14 (2023).

Matrice de compatibilité

Ce tableau indique les versions de kernel compatibles et testées avec chaque version de la plate-forme Android.

Version de la plate-forme Android Kernels compatibles pour la mise à niveau Kernels compatibles pour le lancement
Android 15 (2024) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android15-6.6
android14-6.1
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

Prise en charge des durées de vie et des correctifs de sécurité

Les ACK reçoivent des fusions LTS en amont et des corrections de bugs pour le code spécifique à Android. Ces correctifs incluent tous les correctifs de sécurité du noyau cités dans les bulletins de sécurité Android mensuels relatifs à ACK.

Les ACK peuvent être pris en charge plus longtemps que le kernel stable en amont correspondant sur kernel.org. Dans ce cas, Google fournit une assistance étendue jusqu'à la date de fin de vie (EOL) indiquée dans cette section. Lorsque les noyaux arrivent en fin de vie, ils ne sont plus pris en charge par Google, et les appareils qui les exécutent sont considérés comme vulnérables.

À partir du kernel 6.6, la durée de prise en charge des kernels stables est de quatre ans.

Ce tableau présente les durées de vie des ACK compatibles:

Branche ACK Date de lancement
Durée de vie

(en ans) de l'assistance
Fin de vie
android-4.19-stable 2018-10-22 6 2025-01-01
android11-5.4 2019-11-24 6 2026-01-01
Android 12-5.4 2019-11-24 6 2026-01-01
android12-5.10 2020-12-13 6 2027-07-01
android13-5.10 2020-12-13 6 2027-07-01
Android 13-5.15 2021-10-31 6 2028-07-01
Android14-5.15 2021-10-31 6 2028-07-01
android14-6.1 2022-12-11 6 2029-07-01
android15-6.6 2023-10-29 4 2028-07-01

Tests de noyau courants

Les noyaux communs sont testés avec plusieurs systèmes CI en plus des tests en aval effectués par les fournisseurs.

Test fonctionnel du noyau Linux

Les tests LKFT (Linux Kernel Functional Test) lancent diverses suites de tests, y compris kselftest, LTP, VTS et CTS, sur un ensemble d'appareils physiques arm32 et arm64. Pour consulter les résultats des tests récents, cliquez ici.

Tests KernelCI

Les tests de compilation et de démarrage KernelCI sont lancés chaque fois qu'un nouveau correctif est validé sur une branche de noyau commune. Plusieurs centaines de configurations de compilation sont testées et démarrées sur différentes cartes. Pour consulter les résultats récents des noyaux Android, cliquez ici.

Tests de préenvoi et postenvoi Android

Les tests préalables à l'envoi sont utilisés pour éviter que des défaillances ne soient introduites dans les noyaux communs Android. Le résumé des résultats du test se trouve dans l'onglet "Checks" (Contrôles) de la modification de code dans le gerrit du kernel commun Android.

Les tests post-soumission Android sont effectués sur les nouveaux builds publiés dans les branches de noyau communes Android lorsque de nouveaux correctifs sont validés dans une branche de noyau commun Android sur ci.android.com. En saisissant aosp_kernel comme nom de branche partiel sur ci.android.com, vous obtenez une liste des branches de noyau avec les résultats disponibles. Par exemple, vous trouverez les résultats pour android-mainline sur cette page. Lorsque vous cliquez sur une compilation spécifique, l'état du test s'affiche dans l'onglet Test Results.

Les tests définis par test-mapping avec le groupe de test kernel-presubmit dans l'arborescence de sources de la plate-forme Android seront exécutés en présoumission pour les branches du kernel Android. Par exemple, la configuration suivante dans test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING activera vts_kernel_proc_file_api_test en tant que test presbumit lors de l'enregistrement commun du code du noyau Android.

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

Tests 0-day

Les tests 0-day effectuent des tests par correctif sur toutes les branches du kernel Android courantes lorsque de nouveaux correctifs sont validés. Différents tests de démarrage, fonctionnels et de performances sont exécutés. Rejoignez le groupe public cros-kernel-buildreports.

Matrice de test

Noyau commun Android Versions de la plate-forme Android Suites de tests
Principal 15 14 13 12 11 10 LKFT KernelCI Avant l'envoi Après l'envoi 0-day
android-mainline
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable

Contribuer aux noyaux communs Android

En règle générale, le développement de fonctionnalités doit être effectué sur le noyau Linux principal et non sur les noyaux communs Android. Le développement en amont est fortement encouragé. Une fois le développement accepté, il peut être facilement rétroporté vers la branche ACK spécifique si nécessaire. L'équipe du kernel Android est ravie de soutenir les efforts d'intégration en amont au profit de l'écosystème Android.

Envoyez des correctifs à Gerrit et respectez ces consignes relatives aux contributions.