Implémenter Bootconfig sous Android 12

Sous Android 12, la fonctionnalité bootconfig remplace Options de ligne de commande du noyau androidboot.* utilisées avec Android 11 et inférieurs. La fonctionnalité bootconfig est un mécanisme permettant de transmettre la configuration les détails du build et du bootloader vers Android 12.

Cette fonctionnalité permet de séparer les paramètres de configuration pour Android d’espace utilisateur de celles pour le noyau. Déplacer le long noyau androidboot.* du fichier bootconfig crée de l'espace sur la ligne de commande du noyau et rend pour l'étendre ultérieurement.

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 12-5.10.xx la version du noyau. 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 très peu différent du format du Ligne de commande du noyau utilisée sous 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 les espaces.

Exemple de bootloader

Pour obtenir un exemple de bootloader, consultez le bootloader de référence Cuttlefish U-boot. la mise en œuvre. Deux commits de la référence sont listés ci-dessous. La première hausse la prise en charge de la version de l’en-tête de démarrage vers la dernière version. Dans cet exemple, la première valider les mises à jour (ou augmenter) la prise en charge de la version vers la version suivante, v4. Le deuxième fait deux choses : il ajoute une gestion bootconfig et montre comment ajouter des paramètres lors de l'exécution:

Exemple de compilation

Pour 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 prendre en charge leurs bootloaders et modifier leur temps de compilation Paramètres androidboot.* 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. consultez les Section Implémentation incrémentielle et validation pour savoir comment suivre un processus incrémentiel.

Si vous avez des modifications qui recherchent androidboot.* dans le fichier /proc/cmdline , faites-les pointer vers le fichier /proc/bootconfig à la place. ro.boot.* sont définies avec les nouvelles valeurs bootconfig. Vous n'avez donc pas besoin du code utilisant 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. Cela fait que le noyau recherche la section bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Les paramètres bootconfig sont créés à partir des paramètres de la section 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. Le noyau configuration de démarrage recherche la section bootconfig et recherche qu’elle se trouve à la fin de initramfs, avec la bande-annonce attendue.

Le bootloader obtient les informations de mise en page vendor_boot.img auprès du fournisseur de l'image de démarrage.

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. 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 des 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 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 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, remplacer la bande-annonce et l'appliquer à nouveau.

Implémentation et validation incrémentielles

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

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: <ph type="x-smartling-placeholder">
      </ph>
    1. Utilisez la variable BOARD_BOOTCONFIG pour ajouter un nouveau bootconfig .
    2. Conservez les paramètres de ligne de commande du noyau tels quels, afin que l'appareil peut continuer à démarrer correctement. Le débogage et la validation sont donc plus facilement.
  2. Vérifiez votre travail en vérifiant le contenu de /proc/bootconfig. Valider que le paramètre nouvellement ajouté 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 que elles ne sont pas dans /proc/cmdline. Si vous pouvez le vérifier, 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 de Android ou les différentes versions de noyau.

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

Les versions 12 à 5.4 et ultérieures du noyau sont compatibles avec bootconfig. Si vous passez à une édition inférieure vers une version antérieure(y compris les versions 11 à 5.4), les paramètres de ligne de commande du noyau doivent être utilisé.

Les mises à niveau d'Android 11 ou version antérieure à Android 12 ou version ultérieure 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

Si les paramètres attendus ne s'affichent pas lorsque vous effectuez l'étape de validation dans /proc/bootconfig, consultez les journaux du noyau dans logcat. Il y a toujours un journal une entrée est présente pour bootconfig si le noyau le prend en charge.

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 la bootconfig. Pour afficher les différents types d'erreurs, consultez init/main.c.