Implémenter Bootconfig sous 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 les détails de la configuration du build 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 du noyau androidboot.* vers le fichier bootconfig crée de l'espace sur la ligne de commande du noyau et le rend disponible pour une extension ultérieure.

Le noyau et l'espace utilisateur Android doivent tous deux prendre en charge bootconfig.

  • Première version prenant en charge Android 12
  • Première version de noyau prenant en charge: 12-5.4.xx

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

Exemples et source

En consultant 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 retour à la 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. La première ligne permet de mettre à jour la compatibilité de l'en-tête de démarrage vers la dernière version. Dans cet exemple, le premier commit met à jour (ou augmente) la compatibilité de la version avec la version suivante, v4. La seconde a deux avantages : elle ajoute la gestion de bootconfig et illustre l'ajout de paramètres au moment de l'exécution :

Exemple de compilation

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

Implémentation

Les partenaires doivent ajouter une prise en charge à leurs bootloaders et déplacer leurs paramètres androidboot.* de temps de compilation de la ligne de commande du noyau vers le fichier bootconfig. Le meilleur moyen de mettre en œuvre cette modification est de le faire de manière incrémentielle. Consultez la section Implémentation incrémentielle et validation pour en savoir plus sur le suivi d'un processus incrémentiel.

Si vous avez des modifications qui recherchent les paramètres androidboot.* dans le fichier /proc/cmdline, faites-les pointer 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 de modifier le code à l'aide de ces propriétés.

Modifications de la compilation

Tout d'abord, passez à la version 4 de l'en-tête de démarrage:

- 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 apportées au bootloader

Le bootloader configure initramfs avant de passer au noyau. La configuration de démarrage du noyau recherche la section bootconfig et la trouve à la 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.

Schéma de la mise en page de l'allocation de mémoire avec bootconfig

Figure 1 : Allocation de mémoire bootconfig d'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
  • 4 B parameters size
  • 4 B parameters checksum
  • 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. Vous devez ajouter des paramètres inconnus.

Les paramètres connus au moment de la compilation sont empaqueté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 qui ne sont pas connus au moment de la compilation ne le sont 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 d'appliquer la bande-annonce bootconfig.

Si vous devez ajouter des paramètres après l'application de la bande-annonce bootconfig, remplacez-la, puis appliquez-la à nouveau.

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. Ne modifiez pas les paramètres de ligne de commande du noyau pendant l'ajout des paramètres bootconfig.

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

  1. Apportez les modifications nécessaires au bootloader et à la compilation, puis procédez comme suit :
    1. Utilisez la variable BOARD_BOOTCONFIG pour ajouter un paramètre bootconfig.
    2. Conservez les paramètres de ligne de commande du noyau tels quels afin que l'appareil puisse continuer à démarrer correctement. Le débogage et la validation sont ainsi beaucoup plus faciles.
  2. Vérifiez votre travail en vérifiant 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 ne figure pas dans /proc/cmdline. Si vous pouvez le vérifier, cela signifie que votre implémentation a réussi.

Remarques concernant les mises à niveau et les rétrogradations OTA

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

Android 12 est la première version compatible avec bootconfig. En cas de retour à une version antérieure, les paramètres de ligne de commande du noyau doivent être utilisés à la place de bootconfig.

Les versions 12 à 5.4 et ultérieures du noyau sont compatibles avec bootconfig. En cas de retour à une version antérieure(y compris les versions 11 à 5.4), les paramètres de ligne de commande du noyau doivent être utilisés.

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 de noyau.

Dépannage

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

Exemple de sortie du 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 est survenu lors du chargement de bootconfig. Pour afficher les différents types d'erreurs, affichez init/main.c.