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 du 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 expansion.
Le noyau et l'espace utilisateur Android doivent être compatibles avec bootconfig
.
- Première version compatible : Android 12
- Première version du 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 vos appareils.
Exemples et source
Lorsque vous examinez 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 les 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 U-boot de Cuttlefish. Deux commits de la référence sont listés ci-dessous. La première mise à niveau augmente 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 augmente) la version compatible à la suivante, v4. Le second fait deux choses : il ajoute la gestion de bootconfig et montre comment ajouter des paramètres au moment de l'exécution :
- Mettez à jour la version de l'en-tête de démarrage vers la dernière version 4.
- Ajoutez la gestion de bootconfig.
Créer un exemple
Pour obtenir un exemple de compilation qui montre les modifications apportées à mkbootimg
pour compiler 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 :
- Utilisez (ou mettez à jour vers) la version 4 de l'en-tête de démarrage du fournisseur.
- Ajoutez bootconfig à la ligne de commande du noyau et déplacez les paramètres sélectionnés vers bootconfig.
Implémentation
Les partenaires doivent ajouter la prise en charge à 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 ce changement est de le faire de manière incrémentielle. Pour savoir comment suivre un processus incrémentiel, consultez la section Implémentation et validation incrémentielles.
Si vous avez apporté des modifications qui recherchent les paramètres androidboot.*
dans le fichier /proc/cmdline, redirigez-les 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 qui utilise ces propriétés.
Modifications de la compilation
Commencez par mettre à jour la version de l'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 vérifie qu'elle se trouve tout à la fin de initramfs,
avec le trailer attendu.
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.
Figure 1 : Allocation de mémoire bootconfig Android 12
Le bootloader crée la section bootconfig en mémoire. La section "bootconfig" contient les allocations de mémoire pour les éléments suivants :
- Paramètres
- Taille 4B
parameters size
- Taille 4B
parameters checksum
- Chaîne magique de configuration du démarrage 12 Mrd (
#BOOTCONFIG\n
)
Les paramètres proviennent de deux sources : les paramètres connus au moment de la compilation et ceux qui ne le sont pas. 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 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 l'application du trailer 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 la procédure décrite dans cette section. Laissez les paramètres de ligne de commande du noyau tels quels pendant que les paramètres bootconfig sont ajoutés.
Voici les étapes d'une implémentation incrémentielle avec validation :
- Effectuez les modifications du bootloader et de la compilation, puis procédez comme suit :
- Utilisez la variable
BOARD_BOOTCONFIG
pour ajouter un paramètre bootconfig. - Conservez les paramètres de ligne de commande du noyau tels quels pour que l'appareil puisse continuer à démarrer correctement. Cela facilite grandement le débogage et la validation.
- Utilisez la variable
- Vérifiez votre travail en consultant le contenu de
/proc/bootconfig
. Vérifiez que le paramètre que vous venez d'ajouter s'affiche une fois l'appareil démarré. - Déplacez les paramètres
androidboot.*
de la ligne de commande du noyau vers bootconfig, en utilisant la variableBOARD_BOOTCONFIG
et le bootloader. - Vérifiez que chacun des paramètres existe dans
/proc/bootconfig
ET qu'ils ne figurent pas dans/proc/cmdline
. Si vous pouvez le vérifier, votre implémentation a réussi.
Points à prendre en compte pour 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 du noyau, vous devez faire particulièrement attention.
Android 12 est la première version compatible avec bootconfig. Si vous passez à une version antérieure, vous devez utiliser les paramètres de ligne de commande du noyau au lieu de bootconfig.
Les versions 12-5.4 et ultérieures du noyau sont compatibles avec bootconfig. Si vous passez à une version antérieure(y compris la version 11-5.4), vous devez utiliser les paramètres de ligne de commande du noyau.
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 noyau.
Dépannage
Lorsque vous effectuez l'étape verify, 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 prend en charge.
Exemple de résultat 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 s'affiche, cela signifie qu'un problème s'est produit lors du chargement de la configuration de démarrage. Pour afficher les différents types d'erreurs, consultez init/main.c.