Implementierung von Bootconfig in Android 12

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:

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:

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 diese 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.

Diagram of bootconfig memory allocation layout

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:

  1. Nehmen Sie die Bootloader- und Build-Änderungen vor und gehen Sie dann wie folgt vor:
    1. Verwenden Sie die Variable BOARD_BOOTCONFIG , um einen neuen Bootconfig-Parameter hinzuzufügen.
    2. 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.
  2. Ü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.
  3. Verschieben Sie die androidboot.* -Parameter von der Kernel-Cmdline nach bootconfig, indem Sie die Variable BOARD_BOOTCONFIG und den Bootloader verwenden.
  4. Stellen Sie sicher , dass alle Parameter in /proc/bootconfig vorhanden sind UND dass sie nicht in /proc/cmdline enthalten 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.