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. Durch das Verschieben der langen androidboot.*
Kernelparameter in die bootconfig-Datei wird Platz in der Kernel-Cmdline geschaffen und für eine einfache zukünftige Erweiterung verfügbar gemacht.
Sowohl der Kernel als auch der Android-Benutzerbereich müssen bootconfig
unterstützen.
- Erste Version, die diese Unterstützung bietet: Android 12
- Erste Kernel-Version, die diese Unterstützung bietet: 12-5.4.xx Kernel
Implementieren Sie die Bootconfig-Funktion für neue Geräte, die mit der Kernelversion 12-5.10.xx 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 Kernel-Cmdline unterscheidet, die in Android 11 und niedriger verwendet wird. Für Ihre Nutzung ist jedoch folgender Unterschied wichtig:
- Parameter müssen durch die Newline-Escape-Sequenz
\n
und nicht durch Leerzeichen getrennt werden.
Bootloader-Beispiel
Ein Bootloader-Beispiel finden Sie in der Cuttlefish U-Boot-Referenz-Bootloader-Implementierung. Zwei Commits in der Referenz sind unten aufgeführt. Beim ersten Upgrade wird die Unterstützung der Boot-Header-Version auf die neueste Version aktualisiert. Im Beispiel aktualisiert (oder uprevs) der erste Commit die Versionsunterstützung auf die nächste, v4. Der zweite bewirkt zwei Dinge; Es fügt die Bootconfig-Verarbeitung 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 Bootconfig-Behandlung hinzu .
Build-Beispiel
Ein Build-Beispiel, das mkbootimg
Änderungen zum Erstellen von vendor_boot.img
mit Vendor-Boot-Header v4 zeigt, finden Sie unter mkbootimg changes for bootconfig
. Sehen Sie sich die Cuttlefish-Änderungen an, um Folgendes zu tun:
- Verwenden Sie die Boot-Header-Version v4 des Herstellers (oder aktualisieren Sie sie).
- Fügen Sie
bootconfig to the kernel cmdline and move selected parameters to bootconfig
.
Implementierung
Partner müssen Unterstützung für ihre Bootloader hinzufügen und ihre androidboot.*
Parameter zur Buildzeit von der Kernel-Cmdline in die Bootconfig-Datei verschieben. Der beste Weg, diese Änderung umzusetzen, besteht darin, dies schrittweise zu tun. Informationen zum Befolgen eines inkrementellen Prozesses finden Sie im Abschnitt „Inkrementelle Implementierung und Validierung“ .
Wenn Sie Änderungen haben, die die Datei /proc/cmdline nach androidboot.*
Parametern durchsuchen, verweisen Sie 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 zunächst Ihre Boot-Header-Version auf Version 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Fügen Sie den bootconfig
Kernel-Cmdline-Parameter 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
erstellt wird.
Alle androidboot.*
Parameter können unverändert verschoben werden, ähnlich wie folgt:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Bootloader-Änderungen
Der Bootloader richtet die initramfs
ein, bevor er zum Kernel springt. Die Kernel-Boot-Konfiguration sucht nach dem Abschnitt „bootconfig“ und stellt fest, dass er sich ganz am Ende von initramfs,
mit dem erwarteten Trailer.
Der Bootloader ruft die Layoutinformationen vendor_boot.img
aus dem Boot-Image-Header des Anbieters ab.
Abbildung 1. Speicherzuordnung für die Bootconfig von Android 12
Der Bootloader erstellt den Bootconfig-Abschnitt im Speicher. Der Abschnitt bootconfig enthält Speicherzuweisungen für Folgendes:
- Parameter
- 4 B-
parameters size
-
parameters checksum
der 4 B-Größenparameter - 12 B magischer Bootconfig-String (
#BOOTCONFIG\n
)
Die Parameter stammen aus zwei Quellen: Parameter, die zum Build-Zeitpunkt bekannt sind, und Parameter, die zum Build-Zeitpunkt nicht bekannt sind. Unbekannte Parameter müssen hinzugefügt werden.
Zur Erstellungszeit bekannte Parameter werden am Ende des vendor_boot
-Images im Abschnitt „bootconfig“ gepackt. Die Größe des Abschnitts wird (in Bytes) im Vendor-Boot-Header-Feld vendor_bootconfig_size
gespeichert.
Die Parameter, die zur Build-Zeit nicht bekannt sind, sind erst 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 unberührt, während die Bootconfig-Parameter hinzugefügt werden.
Dies sind die Schritte für eine inkrementelle Implementierung mit Validierung:
- Nehmen Sie die Bootloader- und 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 bei, so wie sie sind, damit das Gerät weiterhin korrekt booten kann. Dies erleichtert das Debuggen und Validieren erheblich.
- Verwenden Sie die Variable
- Überprüfen Sie Ihre Arbeit, indem Sie den Inhalt von
/proc/bootconfig
überprüfen. Stellen Sie sicher, dass Sie den neu hinzugefügten Parameter sehen, nachdem das Gerät gestartet wurde. - Verschieben Sie die
androidboot.*
-Parameter von der Kernel-Cmdline nach bootconfig, indem Sie die VariableBOARD_BOOTCONFIG
und den Bootloader verwenden. - Stellen Sie sicher , dass alle Parameter in
/proc/bootconfig
vorhanden sind UND dass sie nicht in/proc/cmdline
vorhanden sind. Wenn Sie dies überprüfen können, war Ihre Implementierung erfolgreich.
Überlegungen zum OTA-Upgrade und -Downgrade
Bei der Verwaltung von OTA-Upgrades und -Downgrades zwischen verschiedenen Android-Versionen oder verschiedenen Kernel-Versionen ist besondere Vorsicht geboten.
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.
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. Das Gleiche gilt für die Aktualisierung von Kernel-Versionen.
Fehlerbehebung
Wenn Sie beim Ausführen des Überprüfungsschritts die erwarteten Parameter in /proc/bootconfig
nicht sehen, überprüfen Sie die Kernel-Protokolle in logcat
. Für bootconfig ist immer ein Protokolleintrag vorhanden, wenn der Kernel dies unterstützt.
Beispiel einer Protokollausgabe
$ 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 anzuzeigen, sehen Sie sich init/main.c an.