Implémenter bootconfig dans Android 12

Dans Android 12, la fonctionnalité bootconfig remplace les options de ligne de commande du noyau androidboot.* utilisées avec Android 11 et versions antérieures. La fonctionnalité bootconfig est un mécanisme permettant de transmettre des informations de configuration de la compilation et du bootloader à Android 12.

Cette fonctionnalité permet de séparer les paramètres de configuration de l'espace utilisateur Android de ceux du noyau. Le déplacement des longs paramètres de noyau androidboot.* vers le fichier bootconfig libère de l'espace sur la ligne de commande du noyau et le rend disponible pour une future extension.

Le noyau et l'espace utilisateur Android doivent être compatibles avec bootconfig.

  • Première version compatible : Android 12
  • Première version de noyau compatible : noyau 12-5.4.xx

Implémentez la fonctionnalité bootconfig pour les nouveaux appareils lancés avec une version du noyau 12-5.10.xx. Vous n'avez pas besoin de l'implémenter si vous mettez à niveau des appareils.

Exemples et source

Lorsque vous consultez les exemples et le code source de cette section, notez que le format du code bootconfig n'est que légèrement différent de celui de la ligne de commande du noyau utilisée dans Android 11 et versions antérieures. Toutefois, la différence suivante est importante pour votre utilisation :

  • Les paramètres doivent être séparés par la séquence d'échappement de saut de ligne \n, et non par des espaces.

Exemple de bootloader

Pour obtenir un exemple de bootloader, consultez l'implémentation du bootloader de référence Cuttlefish U-boot. Deux commits de la référence sont listés ci-dessous. Le premier met à niveau la compatibilité de la version de l'en-tête de démarrage vers la dernière version. Dans l'exemple, le premier commit met à jour (ou met à niveau) la compatibilité de la version vers la suivante, v4. Le second effectue deux actions : il ajoute la gestion de bootconfig et montre comment ajouter des paramètres au moment de l'exécution :

Exemple de compilation

Pour obtenir un exemple de compilation qui montre les modifications mkbootimg permettant de compiler le vendor_boot.img avec l'en-tête de démarrage du fournisseur v4, consultez mkbootimg changes for bootconfig. Consultez les modifications apportées à Cuttlefish pour effectuer les opérations suivantes :

Implémentation

Les partenaires doivent ajouter la compatibilité à leurs bootloaders et déplacer leurs paramètres androidboot.* au moment de la compilation de la ligne de commande du noyau vers le fichier bootconfig. La meilleure façon d'implémenter cette modification est de le faire de manière incrémentielle. Pour en savoir plus sur le suivi d'un processus incrémentiel, consultez la section Implémentation et validation incrémentielles .

Si vous avez des modifications qui recherchent les paramètres androidboot.* dans le fichier /proc/cmdline, pointez-les plutôt vers le fichier /proc/bootconfig. Les propriétés ro.boot.* sont définies avec les nouvelles valeurs bootconfig. Vous n'avez donc pas besoin d'apporter de modifications au code qui utilise ces propriétés.

Modifications de la compilation

Tout d'abord, mettez à niveau la version de votre en-tête de démarrage vers la version 4 :

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Ajoutez le paramètre de ligne de commande du noyau bootconfig. Le noyau recherche alors la section bootconfig :

BOARD_KERNEL_CMDLINE += bootconfig

Les paramètres bootconfig sont créés à partir des paramètres de la variable BOARD_BOOTCONFIG, tout comme la ligne de commande du noyau est créée à partir de BOARD\_KERNEL\_CMDLINE.

Tous les paramètres androidboot.* peuvent être déplacés tels quels, comme suit :

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Modifications du bootloader

Le bootloader configure initramfs avant de passer au noyau. La configuration de démarrage du noyau recherche la section bootconfig et s'attend à ce qu'elle se trouve à la toute fin de initramfs, avec la bande-annonce attendue.

Le bootloader obtient les informations de mise en page vendor_boot.img à partir de l'en-tête de l'image de démarrage du fournisseur.

Diagramme de la mise en page de l'allocation de mémoire bootconfig

Figure 1. Allocation de mémoire bootconfig Android 12

Le bootloader crée la section bootconfig en mémoire. La section bootconfig contient des allocations de mémoire pour les éléments suivants :

  • Paramètres
  • parameters size de 4 octets
  • parameters checksum de 4 octets
  • Chaîne magique bootconfig de 12 octets (#BOOTCONFIG\n)

Les paramètres proviennent de deux sources : les paramètres connus au moment de la compilation et les paramètres inconnus au moment de la compilation. Les paramètres inconnus doivent être ajoutés.

Les paramètres connus au moment de la compilation sont regroupés à la fin de l'image vendor_boot dans la section bootconfig. La taille de la section est stockée (en octets) dans le champ d'en-tête de démarrage du fournisseur vendor_bootconfig_size.

Les paramètres inconnus au moment de la compilation ne sont connus qu'au moment de l'exécution dans le bootloader. Ils doivent être ajoutés à la fin de la section des paramètres bootconfig avant l'application de la bande-annonce bootconfig.

Si vous devez ajouter des paramètres après l'application de la bande-annonce bootconfig, remplacez-la et réappliquez-la.

Implémentation et validation incrémentielles

Implémentez la fonctionnalité bootconfig de manière incrémentielle en suivant le processus décrit dans cette section. Laissez les paramètres de ligne de commande du noyau tels quels pendant l'ajout des paramètres bootconfig.

Voici les étapes d'une implémentation incrémentielle, avec validation :

  1. Apportez les modifications au bootloader et à la compilation, puis procédez comme suit :
    1. Utilisez la variable BOARD_BOOTCONFIG pour ajouter un paramètre bootconfig.
    2. Laissez les paramètres de ligne de commande du noyau tels quels afin que l'appareil puisse continuer à démarrer correctement. Cela facilite grandement le débogage et la validation.
  2. Vérifiez votre travail en examinant le contenu de /proc/bootconfig. Vérifiez que le paramètre que vous venez d'ajouter s'affiche après le démarrage de l'appareil.
  3. Déplacez les paramètres androidboot.* de la ligne de commande du noyau vers bootconfig à l'aide de la variable BOARD_BOOTCONFIG et du bootloader.
  4. Vérifiez que chacun des paramètres existe dans /proc/bootconfig ET qu' il n'est pas dans /proc/cmdline. Si vous pouvez le vérifier, votre implémentation a réussi.

Considérations concernant la mise à niveau et la rétrogradation OTA

Lorsque vous gérez les mises à niveau et les rétrogradations OTA entre différentes versions d'Android ou différentes versions du noyau, vous devez faire particulièrement attention.

Android 12 est la première version compatible avec bootconfig. Si vous effectuez une rétrogradation vers une version antérieure, vous devez utiliser les paramètres de ligne de commande du noyau au lieu de bootconfig.

Les versions du noyau 12-5.4 et ultérieures sont compatibles avec bootconfig. Si vous effectuez une rétrogradation vers une version antérieure(y compris 11-5.4), vous devez utiliser les paramètres de ligne de commande du noyau.

Les mises à niveau d'Android 11 et versions antérieures vers Android 12 et versions ultérieures peuvent continuer à utiliser les paramètres de ligne de commande du noyau. Il en va de même pour la mise à niveau des versions du noyau.

Dépannage

Lorsque vous effectuez l'étape de vérification, si les paramètres attendus ne s'affichent pas dans /proc/bootconfig, consultez les journaux du noyau dans logcat. Une entrée de journal est toujours présente pour bootconfig si le noyau est compatible.

Exemple de sortie de journal

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

Si un journal d'erreurs est renvoyé, cela signifie qu'un problème s'est produit lors du chargement de bootconfig. Pour afficher différents types d'erreurs, consultez init/main.c.