Bootconfig in Android 12 implementieren

In Android 12 ersetzt die Boot-Config-Funktion die androidboot.*-Kernel-cmdline-Optionen, die unter 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 lassen sich die Konfigurationsparameter für Android User-Space von denen für den Kernel. Wenn Sie die langen androidboot.*-Kernelparameter in die bootconfig-Datei verschieben, schaffen Sie Platz auf der Kernel-Befehlszeile und machen sie für zukünftige Erweiterungen verfügbar.

Sowohl der Kernel als auch der Android-Nutzerbereich 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 der Kernelversion 12-5.10.xx ausgeliefert werden. Sie müssen diese nicht implementieren, wenn Sie Geräte aktualisieren.

Beispiele und Quelle

Wenn Sie sich die Beispiele und den Quellcode in diesem Abschnitt ansehen, beachten Sie, dass das Format des bootconfig-Codes unterscheidet sich nur geringfügig vom Format des die unter Android 11 und niedriger verwendete Kernel-cmdline. Für die Nutzung ist jedoch der folgende Unterschied wichtig:

  • Parameter müssen durch die Escapesequenz \n für Zeilenumbrüche getrennt werden, nicht durch Leerzeichen.

Bootloader-Beispiel

Ein Beispiel für einen Bootloader finden Sie in der Cuttlefish-U-Boot-Referenz-Bootloader-Implementierung. Unten sind zwei Commits in der Referenz aufgeführt. Erste Steigerungen die Unterstützung der Boot-Header-Version auf die neueste Version. Im Beispiel aktualisiert das erste Commit die Versionsunterstützung auf die nächste Version, v4. Die zweite macht zwei Dinge: fügt eine bootconfig-Verarbeitung hinzu und zeigt das Hinzufügen von Parametern zur Laufzeit:

Beispiel erstellen

Für ein Build-Beispiel, das mkbootimg-Änderungen zum Erstellen des vendor_boot.img mit Vendor Boot Header Version 4 (siehe mkbootimg changes for bootconfig). In den Änderungen an Sepien sehen Sie Folgendes:

Implementierung

Partner müssen ihren Bootloadern Unterstützung hinzufügen und ihre androidboot.*-Buildzeitparameter aus der Kernel-Befehlszeile in die Boot-Konfigurationsdatei verschieben. Am besten implementieren Sie diese Änderung inkrementell. Weitere Informationen zu einem inkrementellen Prozess finden Sie im Abschnitt Inkrementelle Implementierung und Validierung.

Wenn Sie Änderungen haben, durch die in der /proc/cmdline-Datei nach androidboot.* gesucht wird verweisen Sie stattdessen auf die Datei /proc/bootconfig. Das ro.boot.* werden mit den neuen bootconfig-Werten festgelegt, sodass Sie keine für Code mit diesen Eigenschaften.

Änderungen am Build

Aktualisieren Sie zuerst die Boot-Header-Version auf Version 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Fügen Sie den bootconfig-Kernel-Befehlszeilenparameter hinzu. Dadurch sucht der Kernel nach dem Abschnitt „bootconfig“:

BOARD_KERNEL_CMDLINE += bootconfig

Die bootconfig-Parameter werden aus den Parametern im BOARD_BOOTCONFIG, ähnlich wie die Kernel-Cmdline, die aus BOARD\_KERNEL\_CMDLINE.

Alle androidboot.*-Parameter können unverändert verschoben werden, z. B. so:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Bootloader-Änderungen

Der Bootloader richtet initramfs ein, bevor er zum Kernel wechselt. Der Kernel Bootkonfiguration sucht nach dem Abschnitt "bootconfig" und sucht danach, dass er sich ganz am Ende initramfs, mit dem erwarteten Trailer.

Der Bootloader ruft die Layoutinformationen für vendor_boot.img vom Anbieter ab. Boot-Image-Header.

Diagramm des Speicherzuweisungslayouts der Boot-Konfiguration

Abbildung 1. Arbeitsspeicherzuweisung für Android 12-Bootconfig

Der Bootloader erstellt den Bootconfig-Abschnitt im Arbeitsspeicher. Abschnitt „bootconfig“ enthält Arbeitsspeicherzuweisungen für Folgendes:

  • Parameter
  • 4 B Größe parameters size
  • 4 B Größe parameters checksum
  • 12 Mrd. magischer Bootconfig-String (#BOOTCONFIG\n)

Die Parameter stammen aus zwei Quellen: Parameter, die zum Zeitpunkt der Erstellung bekannt sind, und Parameter, die zum Zeitpunkt der Erstellung nicht bekannt sind. Unbekannte Parameter müssen hinzugefügt werden.

Beim Build bekannte Parameter werden am Ende des vendor_boot gepackt im Abschnitt "bootconfig". Die Größe des Abschnitts wird (als Byte) gespeichert. im Header-Feld vendor_bootconfig_size des Anbieters.

Die Parameter, die zum Zeitpunkt der Erstellung nicht bekannt sind, sind nur zur Laufzeit im Bootloader bekannt. Diese müssen am Ende des Abschnitts für die Bootconfig-Parameter hinzugefügt werden bevor der bootconfig-Trailer angewendet wird.

Wenn Sie nach dem Anwenden des bootconfig-Trailers Parameter hinzufügen müssen, Trailer zu überschreiben und ihn noch einmal anzuwenden.

Inkrementelle Implementierung und Validierung

Implementieren Sie die bootconfig-Funktion inkrementell, indem Sie dem unter diesem Abschnitt. Lassen Sie die Kernel-Cmdline-Parameter unverändert, während bootconfig-Parameter hinzugefügt.

Dies sind die Schritte für eine inkrementelle Implementierung mit Validierung:

  1. Nehmen Sie den Bootloader vor, erstellen Sie Änderungen und gehen Sie dann so vor:
    1. Verwenden Sie die Variable BOARD_BOOTCONFIG, um eine neue Bootconfig hinzuzufügen. .
    2. Behalten Sie die Kernel-cmdline-Parameter unverändert bei, damit das Gerät weiterhin ordnungsgemäß starten kann. Das erleichtert die Fehlerbehebung und Validierung erheblich.
  2. Prüfen Sie Ihre Arbeit anhand des Inhalts von /proc/bootconfig. Prüfen Sie, ob der neu hinzugefügte Parameter nach dem Starten des Geräts angezeigt wird.
  3. Verschieben Sie die androidboot.*-Parameter mithilfe der Variablen BOARD_BOOTCONFIG und des Bootloaders aus der Kernel-Befehlszeile in die Bootkonfiguration.
  4. Prüfen Sie, ob alle Parameter in /proc/bootconfig vorhanden und nicht in /proc/cmdline enthalten sind. Wenn Sie dies überprüfen können, war erfolgreich.

Überlegungen zum Upgrade und Downgrade von OTA

Bei der Verwaltung von OTA-Upgrades und -Downgrades zwischen verschiedenen Android-Versionen oder verschiedenen Kernelversionen ist besondere Vorsicht geboten.

Android 12 ist die erste Version mit bootconfig Support. Wenn Sie auf eine frühere Version downgraden, müssen anstelle von „bootconfig“ Kernel-Befehlszeilenparameter verwendet werden.

Die Kernelversionen 12–5.4 und höher unterstützen bootconfig. Wenn Sie auf eine frühere Version downgraden (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 die Kernel-Befehlszeilenparameter weiter verwendet werden. Dasselbe gilt für das Upgrade der Kernel-Versionen.

Fehlerbehebung

Wenn Sie beim Schritt verify (Prüfen) die erwarteten Parameter in /proc/bootconfig nicht sehen, prüfen Sie die Kernel-Protokolle in logcat. Wenn der Kernel dies unterstützt, ist immer ein Protokolleintrag für „bootconfig“ vorhanden.

Beispiel für eine Logausgabe

$ 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 aus. Die verschiedenen Fehlertypen finden Sie unter init/main.c