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:
- Mise à niveau de la prise en charge de la version de l'en-tête de démarrage vers la dernière version v4 version.
- Ajoutez le sous-réseau bootconfig gestion.
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:
- Utilisez (ou augmentez) la version de l'en-tête de démarrage du fournisseur. version 4.
- Ajoutez bootconfig à la ligne de commande du noyau et déplacez les paramètres sélectionnés vers bootconfig.
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.
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:
- Apportez les modifications nécessaires au bootloader et à la compilation, puis procédez comme suit:
<ph type="x-smartling-placeholder">
- </ph>
- Utilisez la variable
BOARD_BOOTCONFIG
pour ajouter un nouveau bootconfig . - 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.
- Utilisez la variable
- 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. - Déplacez les paramètres
androidboot.*
de la ligne de commande du noyau vers bootconfig à l'aide de la variableBOARD_BOOTCONFIG
et du bootloader. - 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.