Implémentation de Bootconfig dans Android 12

Dans Android 12, la fonctionnalité bootconfig remplace les options de la ligne de commande du noyau androidboot.* utilisées avec Android 11 et les versions antérieures. La fonctionnalité bootconfig est un mécanisme permettant de transmettre les détails de configuration de la construction et du chargeur de démarrage à 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 expansion future facile.

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

  • Première version qui a ce support : Android 12
  • Première version du noyau qui a ce support : noyau 12-5.4.xx

Implémentez la fonctionnalité bootconfig pour les nouveaux périphériques 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

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 du format de la ligne de commande du noyau utilisée dans Android 11 et les versions antérieures. Cependant, la différence suivante est importante pour votre utilisation :

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

Exemple de chargeur de démarrage

Pour un exemple de chargeur de démarrage, consultez l'implémentation du chargeur de démarrage de référence Cuttlefish U-boot. Deux commits dans la référence sont listés ci-dessous. Le premier uprevs la prise en charge de la version de l'en-tête de démarrage à la dernière version. Dans l'exemple, le premier commit met à jour (ou uprevs) le support de version vers le suivant, v4. Le second fait deux choses; il ajoute la gestion de bootconfig et illustre l'ajout de paramètres lors de l'exécution :

Exemple de construction

Pour un exemple de build qui montre les modifications de mkbootimg pour générer 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 à Seiche pour effectuer les opérations suivantes :

Mise en œuvre

Les partenaires doivent ajouter la prise en charge de leurs chargeurs de démarrage et déplacer leurs paramètres androidboot.* au moment de la construction de la ligne de commande du noyau vers le fichier bootconfig. La meilleure façon de mettre en œuvre ce changement est de le faire progressivement ; voir la section Implémentation et validation incrémentielles pour plus d'informations sur le suivi d'un processus incrémentiel.

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 de modifier le code utilisant ces propriétés.

Modifications de construction

Tout d'abord, faites passer la version de votre en-tête de démarrage à la version 4 :

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Ajoutez le paramètre bootconfig du noyau bootconfig. Cela oblige le noyau à rechercher 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 cmdline 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 chargeur de démarrage

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

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

Diagram of bootconfig memory allocation layout

Figure 1. Allocation de mémoire de configuration de démarrage Android 12

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

  • Paramètres
  • 4 taille des parameters size B
  • Somme de parameters checksum de taille 4 B
  • Chaîne magique de configuration de démarrage 12 B ( #BOOTCONFIG\n )

Les paramètres proviennent de deux sources : les paramètres connus au moment de la génération et les paramètres qui ne sont pas connus au moment de la génération. Les paramètres inconnus doivent être ajoutés.

Les paramètres connus au moment de la construction 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 qui ne sont pas connus au moment de la construction ne le sont qu'au moment de l'exécution dans le chargeur de démarrage. Ceux-ci doivent être ajoutés à la fin de la section des paramètres de bootconfig avant l'application de la bande-annonce de bootconfig.

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

Implémentation et validation incrémentielles

Implémentez la fonctionnalité bootconfig de manière incrémentielle en suivant le processus indiqué dans cette section. Laissez les paramètres de ligne de commande du noyau intacts pendant que les paramètres de bootconfig sont ajoutés.

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

  1. Apportez des modifications au chargeur de démarrage et à la compilation, puis procédez comme suit :
    1. Utilisez la variable BOARD_BOOTCONFIG pour ajouter un nouveau paramètre bootconfig.
    2. Conservez les paramètres de ligne de commande du noyau tels qu'ils sont, afin que le périphérique puisse continuer à démarrer correctement. Cela facilite grandement le débogage et la validation.
  2. Vérifiez votre travail en vérifiant le contenu de /proc/bootconfig . Vérifiez que vous voyez le paramètre nouvellement ajouté 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 chargeur de démarrage.
  4. Vérifiez que chacun des paramètres existe dans /proc/bootconfig ET qu'ils ne se trouvent pas dans /proc/cmdline . Si vous pouvez le vérifier, votre implémentation a réussi.

Considérations de mise à niveau et de 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, une attention particulière doit être portée.

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

Les versions de noyau 12-5.4 et ultérieures prennent en charge bootconfig. Si vous rétrogradez vers une version antérieure (y compris 11-5.4), les paramètres de la 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 du 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 . Il y a toujours une entrée de journal présente pour bootconfig si le noyau le prend en charge.

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 vous voyez un journal d'erreurs renvoyé, il y a eu un problème lors du chargement de bootconfig. Pour voir différents types d'erreurs, consultez init/main.c .