Bootconfig in Android 12 implementieren

In Android 12 ersetzt die Bootconfig-Funktion die androidboot.*-Kernel-Cmdline-Optionen, die mit Android 11 verwendet werden und niedriger. Das Feature „bootconfig“ ist ein Mechanismus zur Übergabe der Konfiguration. vom Build und Bootloader bis hin zu Android 12.

Mit dieser Funktion lassen sich die Konfigurationsparameter für Android trennen. User-Space von denen für den Kernel. Langen androidboot.*-Kernel verschieben für die Datei bootconfig schafft Platz auf der Kernel-Cmdline und sorgt dafür, für eine spätere Erweiterung verfügbar.

Sowohl der Kernel als auch der Android-Nutzerbereich müssen bootconfig unterstützen.

  • Erste Version mit dieser Unterstützung: Android 12
  • Erste Kernel-Version mit dieser Unterstützung: 12-5.4.xx Kernel

Implementieren Sie die Bootconfig-Funktion für neue Geräte, die mit einer 12-5.10.xx-Version auf den Markt kommen. Kernel-Version. 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. Der folgende Unterschied ist jedoch wichtig für Ihre Verwendung:

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

Bootloader-Beispiel

Ein Beispiel für einen Bootloader findest du im Referenz-Bootloader von Cuttlefish U-Boot Implementierung. Zwei Commits in der Referenz sind unten aufgeführt. Die ersten Steigerungen Unterstützung der Boot-Header-Version auf die neueste Version. In diesem Beispiel Führen Sie ein Commit von Updates (oder Uprevs) der Versionsunterstützung auf die nächste Version, v4, durch. Die zweite macht zwei Dinge: fügt eine bootconfig-Verarbeitung hinzu und zeigt das Hinzufügen von Parametern zur Laufzeit:

Build-Beispiel

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 Support für ihre Bootloader hinzufügen und ihre Build-Zeit verschieben androidboot.*-Parameter von der Kernel-Cmdline zur Bootconfig -Datei. Am besten implementieren Sie diese Änderung inkrementell. sieh dir die Abschnitt Inkrementelle Implementierung und Validierung finden Sie Informationen zum Durchführen eines inkrementellen Prozesses.

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.

Build-Änderungen

Erhöhen Sie zuerst die Boot-Header-Version auf Version 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Fügen Sie den Kernel-cmdline-Parameter bootconfig hinzu. Dadurch sucht der Kernel nach den Abschnitt bootconfig an:

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. Das sieht dann so aus:

- 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 Layouts für die Bootconfig-Arbeitsspeicherzuweisung

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.

Parameter, die zum Zeitpunkt der Erstellung bekannt waren, werden am Ende von 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 während der Laufzeit in der Bootloader. 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: <ph type="x-smartling-placeholder">
      </ph>
    1. Verwenden Sie die Variable BOARD_BOOTCONFIG, um eine neue Bootkonfiguration hinzuzufügen. .
    2. Behalten Sie die Kernel-cmdline-Parameter unverändert bei, damit das Gerät weiterhin ordnungsgemäß starten kann. Dadurch wird die Fehlerbehebung und Validierung einfacher zu machen.
  2. Bestätigen Sie Ihre Arbeit, indem Sie den Inhalt von /proc/bootconfig überprüfen. Bestätigen dass der neu hinzugefügte Parameter nach dem Starten des Geräts angezeigt wird.
  3. Verschieben Sie die androidboot.*-Parameter von der Kernel-Cmdline in bootconfig mit der Variablen BOARD_BOOTCONFIG und dem Bootloader.
  4. Überprüfen Sie, ob alle Parameter in /proc/bootconfig vorhanden sind UND dass Sie sind nicht in /proc/cmdline. Wenn Sie dies überprüfen können, war erfolgreich.

Überlegungen zum Upgrade und Downgrade von OTA

Wenn Sie OTA-Upgrades und -Downgrades zwischen verschiedenen Android oder anderen Kernel-Versionen sollten Sie besonders vorsichtig sein.

Android 12 ist die erste Version mit bootconfig Support. Bei einem Downgrade auf eine frühere Version: muss anstelle von bootconfig verwendet werden.

Kernel-Versionen 12 bis 5.4 und höher unterstützen bootconfig. Bei Downgrade auf eine beliebige frühere Version(einschließlich 11 bis 5.4) aktualisiert, müssen die Kernel-cmdline-Parameter verwendet.

Bei Upgrades von Android 11 und niedriger auf Android 12 und höher können Kernel-cmdline-Parameter. Dasselbe gilt für das Upgrade der Kernel-Versionen.

Fehlerbehebung

Wenn Sie den Schritt verify ausführen und die erwarteten Parameter nicht sehen, Prüfen Sie in /proc/bootconfig die Kernellogs in logcat. Es gibt immer ein Protokoll für bootconfig vorhanden, wenn der Kernel dies unterstützt.

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