Implementierung von Bootconfig in Android 12

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

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:

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:

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.

Diagram of bootconfig memory allocation layout

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:

  1. Nehmen Sie den Bootloader und die 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 unverändert bei, damit das Gerät weiterhin korrekt booten kann. Dies erleichtert das Debuggen und die Validierung erheblich.
  2. Ü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.
  3. Verschieben Sie die Parameter androidboot.* 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 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 .