In Android 12 ersetzt die bootconfig-Funktion die Kernel-cmdline-Optionen androidboot.*
, die mit Android 11 und niedriger verwendet werden. Die Bootconfig-Funktion ist ein Mechanismus zum Übergeben von Konfigurationsdetails vom Build und Bootloader an Android 12.
Diese Funktion bietet eine Möglichkeit, die Konfigurationsparameter für den Android-Benutzerbereich von denen für den Kernel zu trennen. Das Verschieben der langen androidboot.*
-Kernelparameter in die bootconfig-Datei schafft Platz in der Kernel-Cmdline und macht ihn für eine einfache zukünftige Erweiterung verfügbar.
Sowohl der Kernel als auch der Android-Benutzerbereich müssen bootconfig
unterstützen.
- Erste Version mit dieser Unterstützung: Android 12
- Erste Kernel-Version, die diese Unterstützung hat: 12-5.4.xx-Kernel
Implementieren Sie die Bootconfig-Funktion für neue Geräte, die mit einer 12-5.10.xx-Kernelversion gestartet werden. Sie müssen es nicht implementieren, wenn Sie Geräte aktualisieren.
Beispiele und Quelle
Beachten Sie beim Betrachten der Beispiele und des Quellcodes in diesem Abschnitt, dass sich das Format des bootconfig
-Codes nur geringfügig vom Format der in Android 11 und niedriger verwendeten Kernel-cmdline unterscheidet. Wichtig für Ihre Nutzung ist jedoch folgender Unterschied:
- Parameter müssen durch die Newline-Escape-Sequenz
\n
getrennt werden, nicht durch Leerzeichen.
Bootloader-Beispiel
Ein Bootloader-Beispiel finden Sie in der Cuttlefish U-Boot-Referenz-Bootloader-Implementierung. Zwei Commits in der Referenz sind unten aufgeführt. Die erste aktualisiert die Boot-Header-Versionsunterstützung auf die neueste Version. In dem Beispiel aktualisiert (oder aktualisiert) der erste Commit die Versionsunterstützung auf die nächste, v4. Der zweite macht zwei Dinge; es fügt Bootconfig-Handling hinzu und demonstriert das Hinzufügen von Parametern zur Laufzeit:
- Aktualisieren Sie die Unterstützung der Boot-Header-Version auf die neueste v4-Version .
- Fügen Sie die Handhabung von bootconfig hinzu .
Beispiel bauen
Ein Build-Beispiel, das mkbootimg
Änderungen zeigt, um die vendor_boot.img
mit dem Vendor-Boot-Header v4 zu erstellen, finden Sie unter mkbootimg changes for bootconfig
. Sehen Sie sich die Cuttlefish-Änderungen an, um Folgendes zu tun:
- Verwenden (oder aktualisieren) Sie die Boot-Header-Version v4 des Anbieters .
- Fügen Sie
bootconfig to the kernel cmdline and move selected parameters to bootconfig
.
Implementierung
Partner müssen ihren Bootloadern Unterstützung hinzufügen und ihre androidboot.*
Parameter zur Erstellungszeit von der Kernel-Cmdline in die Datei bootconfig verschieben. Diese Änderung lässt sich am besten schrittweise implementieren. Informationen zum Befolgen eines inkrementellen Prozesses finden Sie im Abschnitt Inkrementelle Implementierung und Validierung .
Wenn Sie Änderungen vorgenommen haben, die die Datei /proc/cmdline nach androidboot.*
-Parametern durchsuchen, verweisen Sie stattdessen auf die Datei /proc/bootconfig. Die ro.boot.*
-Eigenschaften werden mit den neuen bootconfig
Werten festgelegt, sodass Sie keine Änderungen am Code vornehmen müssen, der diese Eigenschaften verwendet.
Build-Änderungen
Aktualisieren Sie zuerst Ihre Boot-Header-Version auf Version 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Fügen Sie den Kernel- bootconfig
-Parameter bootconfig hinzu. Dadurch sucht der Kernel nach dem Abschnitt bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
Die Bootconfig-Parameter werden aus den Parametern in der Variablen BOARD_BOOTCONFIG
erstellt, ähnlich wie die Kernel-cmdline aus BOARD\_KERNEL\_CMDLINE
.
Alle androidboot.*
-Parameter können unverändert verschoben werden, ähnlich wie im Folgenden:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Bootloader-Änderungen
Der Bootloader richtet das initramfs
ein, bevor er zum Kernel springt. Die Kernel-Boot-Konfiguration sucht nach dem bootconfig-Abschnitt und sucht danach, dass er sich ganz am Ende von initramfs,
mit dem erwarteten Trailer befindet.
Der Bootloader ruft die Layout-Informationen von vendor_boot.img
aus dem Header des Boot-Image des Herstellers ab.
Abbildung 1. Android 12 Bootconfig-Speicherzuweisung
Der Bootloader erstellt den bootconfig-Abschnitt im Speicher. Der Bootconfig-Abschnitt enthält Speicherzuweisungen für Folgendes:
- Parameter
- 4 B-Größe
parameters size
- 4
parameters checksum
Größe B - 12 B Bootconfig Magic String (
#BOOTCONFIG\n
)
Die Parameter stammen aus zwei Quellen: Parameter, die zur Erstellungszeit bekannt sind, und Parameter, die zur Erstellungszeit nicht bekannt sind. Unbekannte Parameter müssen hinzugefügt werden.
Parameter, die zur Erstellungszeit bekannt sind, werden am Ende des vendor_boot
-Images im Bootconfig-Abschnitt gepackt. Die Größe des Abschnitts wird (in Bytes) im Vendor-Boot-Header-Feld vendor_bootconfig_size
.
Die Parameter, die zur Build-Zeit nicht bekannt sind, sind nur zur Laufzeit im Bootloader bekannt. Diese müssen am Ende des Abschnitts mit den Bootconfig-Parametern hinzugefügt werden, bevor der Bootconfig-Trailer angewendet wird.
Wenn Sie Parameter hinzufügen müssen, nachdem der Bootconfig-Trailer angewendet wurde, überschreiben Sie den Trailer und wenden Sie ihn erneut an.
Inkrementelle Implementierung und Validierung
Implementieren Sie die bootconfig-Funktion schrittweise, indem Sie dem in diesem Abschnitt beschriebenen Prozess folgen. Lassen Sie die Kernel-cmdline-Parameter unverändert, während die bootconfig-Parameter hinzugefügt werden.
Dies sind die Schritte für eine inkrementelle Implementierung mit Validierung:
- Nehmen Sie den Bootloader und die Build-Änderungen vor und gehen Sie dann wie folgt vor:
- Verwenden Sie die Variable
BOARD_BOOTCONFIG
, um einen neuen bootconfig-Parameter hinzuzufügen. - Behalten Sie die Kernel-Cmdline-Parameter unverändert bei, damit das Gerät weiterhin korrekt booten kann. Dies erleichtert das Debuggen und die Validierung erheblich.
- Verwenden Sie die Variable
- Überprüfen Sie Ihre Arbeit, indem Sie den Inhalt von
/proc/bootconfig
. Stellen Sie sicher, dass Sie den neu hinzugefügten Parameter sehen, nachdem das Gerät gestartet wurde. - Verschieben Sie die Parameter
androidboot.*
von der Kernel-Cmdline nach bootconfig, indem Sie die VariableBOARD_BOOTCONFIG
und den Bootloader verwenden. - Stellen Sie sicher, dass alle Parameter in
/proc/bootconfig
sind UND dass sie sich nicht in/proc/cmdline
. Wenn Sie dies verifizieren können, war Ihre Implementierung erfolgreich.
Überlegungen zum OTA-Upgrade und -Downgrade
Wenn Sie OTA-Upgrades und -Downgrades zwischen verschiedenen Android-Versionen oder verschiedenen Kernel-Versionen verwalten, sollten Sie besonders vorsichtig sein.
Android 12 ist die erste Version mit Bootconfig-Unterstützung. Bei einem Downgrade auf eine frühere Version müssen Kernel-cmdline-Parameter anstelle von bootconfig verwendet werden.
Die Kernel-Versionen 12-5.4 und höher unterstützen bootconfig. Bei einem Downgrade auf eine frühere Version (einschließlich 11-5.4) müssen Kernel-cmdline-Parameter verwendet werden.
Upgrades von Android 11 und älter auf Android 12 und höher können weiterhin Kernel-Cmdline-Parameter verwenden. Dasselbe gilt für das Upgrade von Kernel-Versionen.
Fehlerbehebung
Wenn Sie beim Ausführen des Überprüfungsschritts die erwarteten Parameter in /proc/bootconfig
nicht sehen, überprüfen Sie die Kernelprotokolle in logcat
. Es ist immer ein Protokolleintrag für bootconfig vorhanden, wenn der Kernel dies unterstützt.
Beispielprotokollausgabe
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Wenn ein Fehlerprotokoll zurückgegeben wird, ist beim Laden der Bootconfig ein Problem aufgetreten. Um verschiedene Fehlertypen zu sehen, sehen Sie sich init/main.c an .