Un noyau produit, également appelé noyau d'appareil ou noyau OEM, est le noyau que vous envoyez sur votre appareil. Avant GKI, le noyau du produit était dérivé d'une série de modifications du noyau en amont. La figure 1 montre comment les ajouts au noyau génèrent un noyau de produit (noyau OEM/appareil):
Figure 1 : Construction du noyau du produit avant GKI.
- Le noyau Linux Long Term supported (LTS) de kernel.org a été modifié à l'aide de correctifs spécifiques à Android, ce qui a entraîné la création d'un kernel commun Android (ACK).
- L'acquittement a été modifié par les fournisseurs qui ont ajouté la prise en charge de leur système sur puce (SoC). Les fournisseurs peuvent également optimiser les performances ou l'alimentation. Le kernel obtenu est appelé kernel du fournisseur.
- Enfin, le noyau du fournisseur a été modifié par les OEM avec des pilotes d'appareils et des personnalisations supplémentaires qu'ils jugent nécessaires. Le noyau obtenu est appelé noyau du produit.
Toutes ces modifications peuvent entraîner jusqu'à 50% du code du noyau en dehors de l'arborescence, et non à partir des noyaux Linux ou des ACK en amont. Avant GKI, presque tous les appareils disposaient d'un kernel personnalisé qui entraînait une fragmentation du kernel.
Coûts de fragmentation
La fragmentation du noyau a plusieurs effets négatifs sur la communauté Android.
Les mises à jour de sécurité sont fastidieuses
Les correctifs de sécurité mentionnés dans le bulletin de sécurité Android (ASB) doivent être rétroportés dans chacun des noyaux de l'appareil. Cependant, en raison de la fragmentation du noyau, il est extrêmement coûteux de propager les correctifs de sécurité aux appareils Android sur le terrain.
Difficile de fusionner les mises à jour compatibles à long terme
Les versions LTS (Long-Term Supported) incluent des correctifs de sécurité et d'autres corrections de bugs critiques. Se tenir informé des versions LTS s'avère être le moyen le plus efficace de fournir des correctifs de sécurité. Sur les appareils Pixel, 90% des problèmes de sécurité du noyau signalés dans l'ASB ont déjà été corrigés pour les appareils qui restent à jour.
Toutefois, avec toutes les modifications personnalisées dans les noyaux de l'appareil, il est difficile de simplement fusionner les correctifs LTS dans les noyaux de l'appareil.
Empêcher les mises à niveau de la version de la plate-forme Android
La fragmentation rend difficile l'ajout de nouvelles fonctionnalités Android nécessitant des modifications du noyau aux appareils sur le terrain. Le code du framework Android doit supposer que jusqu'à cinq versions de kernel sont compatibles et qu'aucune modification de kernel n'a été apportée pour la nouvelle version de la plate-forme (Android 10 est compatible avec les kernels 3.18, 4.4, 4.9, 4.14 et 4.19, qui, dans certains cas, n'ont pas été améliorés avec de nouvelles fonctionnalités depuis Android 8 en 2017).
Difficulté à contribuer aux modifications du noyau dans Linux en amont
Avec toutes les modifications apportées au noyau, la plupart des appareils phares sont livrés avec une version du noyau qui a déjà au moins 18 mois. Par exemple, le noyau 4.14 a été publié par kernel.org
en novembre 2017, et les premiers téléphones Android utilisant des noyaux 4.14 ont été commercialisés au printemps 2019.
Ce long délai entre la publication du kernel en amont et les produits rend difficile pour la communauté Android de fournir les fonctionnalités et les pilotes nécessaires aux kernels en amont.
Résoudre la fragmentation: image de noyau générique
Le projet Generic Kernel Image (GKI) corrige la fragmentation du noyau en unifiant le noyau principal et en déplaçant la prise en charge du SoC et des cartes du noyau principal vers des modules fournisseurs chargeables. GKI présente également une interface de module de noyau (KMI) stable pour les modules du fournisseur, ce qui permet de mettre à jour les modules et le noyau indépendamment. Voici quelques caractéristiques du kernel GKI:
- Le noyau GKI est construit à partir des sources ACK.
- Le noyau GKI est un binaire à noyau unique, ainsi que des modules chargeables associés par architecture et par version LTS (actuellement, uniquement arm64 pour
android11-5.4
etandroid12-5.4
). - Le noyau GKI est testé avec toutes les versions de la plate-forme Android compatibles avec l'ACK associé. Aucune fonctionnalité n'est abandonnée pendant la durée de vie d'une version du noyau GKI.
- Le noyau GKI expose un KMI stable aux pilotes d'un LTS donné.
- Le noyau GKI ne contient pas de code spécifique au SoC ni à la carte.
Pour obtenir une image de l'architecture du kernel GKI, consultez la présentation du kernel.
GKI est un changement complexe qui a été déployé en plusieurs étapes à partir des noyaux v5.4 de la version de la plate-forme Android 11.
Il existe deux étapes de GKI:
- GKI 1.0 a été introduit dans Android 11 pour les appareils équipés de noyaux 5.4. GKI 1.0 s'applique à tous les appareils livrés avec des noyaux 5.4, même ceux lancés avec Android 12 ou Android 13.
- GKI 2.0 a été introduit dans Android 12 pour les appareils dotés de noyaux 5.10. Il s'agit de la nouvelle norme pour tous les appareils équipés de noyaux 5.10 ou version ultérieure.
GKI 1.0
Dans GKI 1.0, les appareils lancés avec la version de noyau 5.4 doivent réussir les tests GKI (Android 11 et versions ultérieures de la plate-forme). Voici les objectifs de la version 1.0 de GKI:
- Évitez les régressions dans la suite de tests du fournisseur (VTS) ou la suite de tests de compatibilité (CTS) lorsque vous remplacez le noyau du produit par le noyau GKI.
- Réduisez la charge pour les partenaires de mettre à jour leur kernel avec les kernels communs AOSP.
- Incluez les modifications principales d'Android dans les noyaux pour les appareils qui effectuent la mise à niveau et le lancement avec les nouvelles versions d'Android.
- Ne perturbez pas l'espace utilisateur Android.
- Séparez les composants matériels du noyau principal en tant que modules chargeables.
Pour en savoir plus sur la documentation GKI 1.0, consultez la section GKI 1.0.
GKI 2.0
Dans GKI 2.0, les appareils lancés avec la version 5.10 du kernel ou une version ultérieure doivent être livrés avec le kernel GKI (à partir d'Android 12). Les images de démarrage signées sont disponibles et mises à jour régulièrement avec des correctifs de bugs critiques et LTS. Étant donné que la stabilité binaire est maintenue pour le KMI, vous pouvez installer ces images de démarrage sans modifier les images du fournisseur. Voici quelques-uns des objectifs de GKI 2.0:
- N'introduisez pas de régressions significatives en termes de performances ou d'alimentation lorsque vous remplacez le kernel du produit par le kernel GKI.
- Permettre aux partenaires de fournir des correctifs de sécurité du noyau et des correctifs de bugs sans l'intervention du fournisseur.
- Réduire le coût de la mise à jour de la version majeure du kernel pour les appareils (par exemple, de la version 5.10 au kernel LTS 2021)
- Gérez un seul binaire de noyau GKI par architecture en mettant à jour les versions de noyau avec un processus de mise à niveau clair.
GKI 2.0 représente l'état le plus récent des noyaux Android. La documentation du kernel en dehors des sous-sections GKI 1.0 et Kernels précédents (<=4.19) reflète l'architecture GKI 2.0.