Implémenter Bootconfig sous Android 12

Dans Android 12, la fonctionnalité bootconfig remplace les options de ligne de commande du kernel androidboot.* utilisées avec Android 11 ou version antérieure. La fonctionnalité bootconfig est un mécanisme permettant de transmettre les détails de configuration de la compilation et du bootloader à 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 être compatibles avec bootconfig.

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

Implémentation de la fonctionnalité bootconfig pour les nouveaux appareils lancés avec une version de kernel 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 très peu différent du format du Ligne de commande du noyau utilisée sous Android 11 et 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 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 mise à niveau de la compatibilité de la version de l'en-tête de démarrage à la dernière version. Dans l'exemple, le premier commit met à jour (ou met à niveau) la compatibilité de la version avec la suivante, la version 4. Le second effectue deux actions : il ajoute la gestion du fichier de démarrage et illustre l'ajout de paramètres au moment de l'exécution :

Exemple de compilation

Pour obtenir un exemple de compilation qui montre les modifications mkbootimg pour créer 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 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 . Le meilleur moyen d'implémenter cette modification est de le faire de manière incrémentielle. Pour en savoir plus sur la procédure à suivre, consultez la section Implémentation et validation incrémentielles.

Si vous avez des modifications qui recherchent androidboot.* dans le fichier /proc/cmdline , faites-les pointer vers le fichier /proc/bootconfig à la place. 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, 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 de bootconfig sont créés à partir des paramètres de la variable BOARD_BOOTCONFIG, tout comme la cmdline du kernel 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 kernel recherche la section "bootconfig" et vérifie qu'elle se trouve tout à la fin de initramfs, avec le conteneur final attendu.

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 d'allocation de mémoire du fichier de démarrage

Figure 1 : Allocation de mémoire du fichier de configuration de démarrage 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
  • Taille 4 B parameters checksum
  • Chaîne magique de 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 au bootloader et à la compilation, puis procédez comme suit :
    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. Vérifiez que le paramètre nouvellement ajouté s'affiche une fois l'appareil démarré.
  3. Déplacez les paramètres androidboot.* de la ligne de commande du kernel vers le fichier de configuration de démarrage, à 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 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 kernel au lieu de bootconfig.

Les versions de kernel 12-5.4 et ultérieures 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 vers 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 du kernel.

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 kernel dans logcat. Une entrée de journal est toujours 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'erreur est renvoyé, un problème s'est produit lors du chargement du fichier de démarrage. Pour afficher les différents types d'erreurs, consultez init/main.c.