In Android 12 ersetzt die Bootconfig-Funktion die androidboot.*
-Kernel-Befehlszeilenoptionen, die in Android 11 und niedriger verwendet werden. Die Bootconfig-Funktion ist ein Mechanismus zum Übergeben von Konfigurationsdetails vom Build und Bootloader an Android 12.
Mit dieser Funktion können die Konfigurationsparameter für den Android-Nutzerbereich von denen für den Kernel getrennt werden. Durch das Verschieben der langen androidboot.*
-Kernelparameter in die Bootconfig-Datei wird Platz in der Kernel-Befehlszeile geschaffen, der für zukünftige Erweiterungen zur Verfügung steht.
Sowohl der Kernel als auch der Android-Userspace müssen bootconfig
unterstützen.
- Erste Version mit dieser Unterstützung: Android 12
- Erste Kernelversion mit dieser Unterstützung: 12-5.4.xx-Kernel
Implementieren Sie die Bootconfig-Funktion für neue Geräte, die mit einer Kernel-Version 12-5.10.xx auf den Markt kommen. Sie müssen sie nicht implementieren, wenn Sie Geräte aktualisieren.
Beispiele und Quelle
Beachten Sie beim Ansehen der Beispiele und des Quellcodes in diesem Abschnitt, dass sich das Format des bootconfig
-Codes nur geringfügig vom Format der Kernel-Befehlszeile in Android 11 und niedriger unterscheidet.
Der folgende Unterschied ist jedoch wichtig für Ihre Nutzung:
- Parameter müssen durch die Escape-Sequenz für den Zeilenumbruch
\n
und nicht durch Leerzeichen getrennt werden.
Beispiel für Bootloader
Ein Beispiel für einen Bootloader finden Sie in der Cuttlefish-Referenzimplementierung des U-Boot-Bootloaders. Unten sind zwei Commits in der Referenz aufgeführt. Zuerst wird die Unterstützung für die Boot-Header-Version auf die neueste Version aktualisiert. Im Beispiel wird mit dem ersten Commit die Versionsunterstützung auf die nächste Version, v4, aktualisiert. Das zweite Beispiel macht zwei Dinge: Es fügt die Verarbeitung von „bootconfig“ hinzu und zeigt, wie Parameter zur Laufzeit hinzugefügt werden:
- Unterstützung für die Boot-Header-Version auf die neueste Version 4 aktualisieren.
- Bootconfig-Verarbeitung hinzufügen
Beispiel erstellen
Ein Build-Beispiel, in dem mkbootimg
-Änderungen zum Erstellen von vendor_boot.img
mit dem Vendor-Boot-Header v4 gezeigt werden, finden Sie unter mkbootimg changes for
bootconfig
.
Die Cuttlefish-Änderungen sind erforderlich, um Folgendes zu tun:
- Verwenden Sie die Vendor-Boot-Header-Version 4 oder aktualisieren Sie auf diese Version.
- Fügen Sie bootconfig in die Kernel-Befehlszeile ein und verschieben Sie ausgewählte Parameter in die Bootkonfiguration.
Implementierung
Partner müssen ihre Bootloader entsprechend anpassen und die androidboot.*
-Parameter für die Build-Zeit aus der Kernel-Befehlszeile in die Bootconfig-Datei verschieben. Am besten implementieren Sie diese Änderung schrittweise. Informationen dazu finden Sie im Abschnitt Schrittweise Implementierung und Validierung.
Wenn Sie Änderungen haben, die in der Datei „/proc/cmdline“ nach androidboot.*
-Parametern suchen, verweisen Sie sie stattdessen auf die Datei /proc/bootconfig
. Die ro.boot.*
-Eigenschaften werden mit den neuen bootconfig
-Werten festgelegt. Sie müssen also keine Änderungen am Code vornehmen, in dem diese Eigenschaften verwendet werden.
Build-Änderungen
Aktualisieren Sie zuerst die Version des Boot-Headers auf Version 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Fügen Sie den Kernel-Befehlszeilenparameter 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-Befehlszeile aus BOARD\_KERNEL\_CMDLINE
erstellt wird.
Alle androidboot.*
-Parameter können unverändert verschoben werden, wie im Folgenden dargestellt:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Bootloader-Änderungen
Der Bootloader richtet die initramfs
ein, bevor er zum Kernel springt. Bei der Kernel-Bootkonfiguration wird nach dem bootconfig-Abschnitt gesucht, der sich am Ende von initramfs,
mit dem erwarteten Trailer befinden muss.
Der Bootloader ruft die vendor_boot.img
-Layoutinformationen aus dem Vendor-Boot-Image-Header ab.
Abbildung 1: Arbeitsspeicherzuweisung für bootconfig unter Android 12
Der Bootloader erstellt den Abschnitt „bootconfig“ im Arbeitsspeicher. Der Abschnitt „bootconfig“ enthält Speicherzuweisungen für Folgendes:
- Parameter
- 4 B-Größe
parameters size
- 4 B-Größe
parameters checksum
- 12 B bootconfig magic string (
#BOOTCONFIG\n
)
Die Parameter stammen aus zwei Quellen: Parameter, die zur Build-Zeit bekannt sind, und Parameter, die zur Build-Zeit nicht bekannt sind. Unbekannte Parameter müssen hinzugefügt werden.
Parameter, die zur Build-Zeit bekannt sind, werden im Bootconfig-Abschnitt am Ende des vendor_boot
-Images verpackt. Die Größe des Abschnitts wird (in Byte) im Feld vendor_bootconfig_size
des Vendor-Boot-Headers gespeichert.
Die Parameter, die zum Zeitpunkt des Builds nicht bekannt sind, sind erst zur Laufzeit im Bootloader bekannt. Diese müssen am Ende des Abschnitts mit den Bootconfig-Parametern vor dem Bootconfig-Trailer hinzugefügt werden.
Wenn Sie nach dem Anwenden des Bootconfig-Trailers Parameter hinzufügen müssen, überschreiben Sie den Trailer und wenden Sie ihn noch einmal an.
Inkrementelle Implementierung und Validierung
Implementieren Sie die Bootconfig-Funktion inkrementell, indem Sie dem in diesem Abschnitt beschriebenen Verfahren folgen. Die Kernel-Befehlszeilenparameter bleiben unverändert, während die Bootconfig-Parameter hinzugefügt werden.
So gehen Sie bei einer inkrementellen Implementierung mit Validierung vor:
- Nehmen Sie die Änderungen am Bootloader und Build vor und gehen Sie dann so vor:
- Verwenden Sie die Variable
BOARD_BOOTCONFIG
, um einen neuen bootconfig-Parameter hinzuzufügen. - Lassen Sie die Kernel-Befehlszeilenparameter unverändert, damit das Gerät weiterhin korrekt gebootet werden kann. Das erleichtert die Fehlersuche und Validierung erheblich.
- Verwenden Sie die Variable
- Überprüfen Sie Ihre Arbeit, indem Sie den Inhalt von
/proc/bootconfig
prüfen. Prüfen Sie, ob der neu hinzugefügte Parameter nach dem Starten des Geräts angezeigt wird. - Verschieben Sie die
androidboot.*
-Parameter aus der Kernel-Befehlszeile in die Bootkonfiguration. Verwenden Sie dazu die VariableBOARD_BOOTCONFIG
und den Bootloader. - Prüfen Sie, ob jeder der Parameter in
/proc/bootconfig
vorhanden ist UND nicht in/proc/cmdline
enthalten ist. Wenn Sie das bestätigen können, war die Implementierung erfolgreich.
Überlegungen zum OTA-Upgrade und ‑Downgrade
Wenn Sie OTA-Upgrades und ‑Downgrades zwischen verschiedenen Android-Versionen oder verschiedenen Kernelversionen verwalten, ist besondere Vorsicht geboten.
Android 12 ist die erste Version mit Unterstützung für „bootconfig“. Wenn Sie ein Downgrade auf eine Version vor dieser durchführen, müssen Sie anstelle von „bootconfig“ Kernel-Befehlszeilenparameter verwenden.
Kernel-Versionen 12-5.4 und höher unterstützen bootconfig. Wenn Sie ein Downgrade auf eine Version vor dieser durchführen(einschließlich 11-5.4), müssen Kernel-Befehlszeilenparameter verwendet werden.
Bei Upgrades von Android 11 und niedriger auf Android 12 und höher können weiterhin Kernel-Befehlszeilenparameter verwendet werden. Dasselbe gilt für das Upgraden von Kernelversionen.
Fehlerbehebung
Wenn Sie beim Bestätigungsschritt die erwarteten Parameter nicht in /proc/bootconfig
sehen, prüfen Sie die Kernel-Logs in logcat
. Wenn der Kernel die Bootkonfiguration unterstützt, ist immer ein Logeintrag dafür vorhanden.
Beispiel für die Logausgabe
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Wenn ein Fehlerlog zurückgegeben wird, gab es ein Problem beim Laden der Bootkonfiguration. Informationen zu verschiedenen Fehlertypen finden Sie unter init/main.c.