Les kernels communs AOSP (également appelés kernel communs Android ou ACK) sont en aval des kernel kernel.org et incluent des correctifs intéressants pour la communauté Android qui n'ont pas été fusionnés dans les kernel principaux ou LTS (Long Term Supported). Ces correctifs peuvent inclure:
- 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 branche principale de Linux est fusionnée dans android-mainline
chaque fois que Linus Torvalds publie une version ou une version candidate. Avant 2019, les noyaux communs 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 généralement 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 kernel GKI android15-6.6
a été introduit.
Kernels de fonctionnalité et de lancement
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 de la version de la plate-forme, les noyaux qui ne disposent pas des dernières fonctionnalités d'une version de plate-forme peuvent toujours ê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
|
android12-5.10
android12-5.4
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
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 du 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 du noyau commun est illustré à la figure 1.
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, lorsque le prochain LTS a été déclaré, android15-6.6
a été dérivé 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 noyau GKI par version de noyau (il n'y a pas de noyau 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.
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 6.6 a été déclaré 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 des partenaires et les corrections de bugs sont toujours acceptées, mais le suivi KMI est activé pour détecter toute modification affectant 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 qu'une nouvelle version de la plate-forme ne soit transmise à AOSP, la branche KMI ACK est figé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 pannes du KMI, certains correctifs fusionnés à partir de LTS peuvent être modifiés ou supprimés si le correctif n'est pas nécessaire 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 tant que les interfaces qui le composent ne sont 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 le noyau commun d'une 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 toute la durée de vie du kernel GKI, la rétrocompatibilité avec l'espace utilisateur est maintenue afin que le kernel puisse être utilisé en toute sécurité pour la version de la plate-forme Android avec laquelle l'appareil a été lancé. Les tests continus avec les versions précédentes garantissent la compatibilité. Par conséquent, dans la figure 2, le kernel android15-6.6
peut être utilisé pour les appareils Android 15 et versions ultérieures. Étant donné que 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 le lancement ou la mise à niveau des appareils Android 15.
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'un 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 de KMI précédente. Les modules doivent donc être recompilés et mis à jour de manière synchrone avec le noyau. Une fois le KMI figé, 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 leurs versions initiales et ultérieures.
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
|
android15-6.6
|
Android 14 (2023) |
android14-6.1
|
android14-6.1
|
Android 13 (2022) |
android13-5.15
|
android13-5.15
|
Android 12 (2021) |
android12-5.10
|
android11-5.4
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
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 mentionnés dans les bulletins de sécurité Android mensuels qui sont pertinents pour 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.
Le tableau suivant 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 |
---|---|---|---|
android11-5.4 | 2019-11-24 | 6 | 2026-01-01 |
android12-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 |
android13-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 kernel 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é dans une branche de kernel 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 post-envoi Android
Les tests de présoumission 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 kernel communes Android lorsque de nouveaux correctifs sont validés dans une branche de kernel commune 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 kernel avec des 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 de présoumission lors de l'enregistrement du code du noyau commun Android.
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
Test 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. Rejoindre le groupe public cros-kernel-buildreports
Matrice de test
Kernel 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
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
Contribuer aux kernels 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 les correctifs à Gerrit et respectez ces consignes de contribution.