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:
- Unterstützung der Boot-Header-Version auf die neueste Version 4 aktualisieren
- Bootconfig hinzufügen Umgang mit Daten.
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:
- Verwenden Sie die Version 4 des Boot-Headers des Anbieters oder aktualisieren Sie sie.
- Fügen Sie bootconfig zur Kernel-Befehlszeile hinzu und verschieben Sie ausgewählte Parameter zu bootconfig.
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.
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:
- Nehmen Sie den Bootloader vor, erstellen Sie Änderungen und gehen Sie dann so vor:
- Verwenden Sie die Variable
BOARD_BOOTCONFIG
, um eine neue Bootconfig hinzuzufügen. . - Behalten Sie die Kernel-cmdline-Parameter unverändert bei, damit das Gerät weiterhin ordnungsgemäß starten kann. Das erleichtert die Fehlerbehebung und Validierung erheblich.
- Verwenden Sie die Variable
- 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. - Verschieben Sie die
androidboot.*
-Parameter mithilfe der VariablenBOARD_BOOTCONFIG
und des Bootloaders aus der Kernel-Befehlszeile in die Bootkonfiguration. - 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