DTB-Images

Android-Implementierungen können ein Gerätebaum-Blob-Image (Device Tree Blob, DTB) enthalten, das vom Bootloader verwendet wird. Der Speicherort des Gerätebaum-Images (und die Optionen zum Angeben von Gerätebaum-Image-Parametern) unterscheidet sich je nach Android-Version.

  • In Android 11 müssen Geräte, die das Generic Kernel Image (GKI) verwenden, die Vendor-Boot-Partition unterstützen. Diese enthält alle anbieterspezifischen Informationen, die aus der Boot-Partition verschoben wurden. Da das DTB-Image anbieterspezifische Daten enthält, ist es jetzt Teil der Vendor-Boot-Partition. Informationen zum Angeben von DTB-Image-Parametern finden Sie unter Vendor-Boot-Header.

  • In Android 10 kann das DTB-Image auf Geräten in der Bootpartition enthalten sein. Informationen zum Angeben von DTB‑Image-Parametern finden Sie unter DTB‑Image in das Boot-Image einfügen.

  • In Android 9 und niedriger kann das DTB-Image in einer eigenen Partition vorhanden sein oder an den Kernel image.gz angehängt werden, um das Kernel + DTB-Image zu erstellen, das dann an mkbootimg übergeben wird, um boot.img zu erstellen.

DTB-Image-Format

Unter Android 10 und höher muss das DTB-Image eines der folgenden Formate haben:

  • Gerätebaum-Blobs, die seriell verkettet sind. Der Bootloader verwendet das Feld totalsize im jeweiligen FDT‑Header, um das entsprechende Blob zu lesen und zu parsen.

  • DTB/DTBO-Partitionen Der Bootloader kann den richtigen Gerätebaum-Blob effizient auswählen, indem er die dt_table_entry-Struktur (mit den Feldern id, rev und custom) untersucht, die Hardware-Identifikationsinformationen für den Eintrag enthalten kann. Weitere Informationen finden Sie unter DTB/DTBO-Partitionen.

DTB-Image in das Boot-Image einfügen

Auf Geräten mit Android 10 kann das DTB-Image im Boot-Image enthalten sein. Dadurch ist es nicht mehr erforderlich, dass Android Skripts unterstützt, die das DTB-Image an image.gz im Kernel anhängen. Außerdem kann der VTS-Test (Vendor Test Suite) verwendet werden, um die DTB-Platzierung zu überprüfen (und zu standardisieren).

Außerdem ist es bei Geräten, die keine A/B‑Geräte sind, sicherer, den Gerätebaum (Device Tree Blob, DTB) als Teil des Wiederherstellungsimages zu haben, anstatt in einer separaten Partition. So lassen sich Probleme vermeiden, die durch unterbrochene OTAs verursacht werden. Wenn während eines OTA-Updates ein Problem auftritt, nachdem die DTB-Partition aktualisiert wurde (aber bevor das vollständige Update abgeschlossen ist), versucht das Gerät, im Wiederherstellungsmodus zu starten, um das OTA-Update abzuschließen. Da die DTB-Partition jedoch bereits aktualisiert wurde, kann es zu einer Abweichung mit dem Wiederherstellungs-Image kommen, das noch nicht aktualisiert wurde. Wenn das DTB-Image Teil des Boot-Image-Formats ist, werden solche Probleme vermieden, da das Recovery-Image in sich geschlossen ist und nicht von einer anderen Partition abhängt.

Boot-Image-Struktur

Geräte mit Android 10 können ein DTB-Image mit der folgenden Boot-Image-Struktur enthalten.

Abschnitt „Boot-Image“ Anzahl der Seiten
Boot-Header (1 Seite) 1
Kernel (l Seiten) l = (kernel_size + page_size – 1) / page_size
Ramdisk (m Seiten) m = (ramdisk_size + page_size – 1) / page_size
Bootloader der zweiten Phase (n Seiten) n = (second_size + page_size – 1) / page_size
Wiederherstellungs-DTBO (o Seiten) o = (recovery_dtbo_size + page_size – 1) ÷ page_size
DTB (p Seiten) p = (dtb_size + page_size – 1) / page_size

DTB-Image-Pfad

Auf Geräten mit Android 10 können Sie das mkbootimg.py-Tool und die folgenden Argumente verwenden, um den Pfad zum DTB-Image anzugeben.

Argument Beschreibung
dtb Pfad zum DTB-Image, das in die Boot-/Recovery-Images aufgenommen werden soll.
dtb_offset Wenn dem Argument base hinzugefügt, wird die physische Ladeadresse für den endgültigen Gerätebaum angegeben. Wenn das base-Argument beispielsweise 0x10000000 und das dtb_offset-Argument 0x01000000 ist, wird dtb_addr_field im Boot-Image-Header als 0x11000000 eingefügt.

Die Platinenkonfigurationsvariable BOARD_PREBUILT_DTBIMAGE_DIR muss verwendet werden, um den Pfad zum DTB-Image anzugeben. Wenn im Verzeichnis BOARD_PREBUILT_DTBIMAGE_DIR mehrere Dateien mit der Erweiterung *.dtb vorhanden sind, verkettet das Android-Build-System die Dateien, um das endgültige DTB-Image zu erstellen, das beim Erstellen des Boot-Images verwendet wird.

Wenn Sie das Argument dtb mit dem DTB-Image aus dem durch BOARD_PREBUILT_DTBIMAGE_DIR angegebenen Verzeichnis an mkbootimg.py übergeben möchten, muss die Platinenkonfigurationsvariable BOARD_INCLUDE_DTB_IN_BOOTIMG auf true gesetzt werden. Beispiel:

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

Sie können das Argument dtb_offset mit den anderen Offsets und der Header-Version an die Boardkonfigurationsvariable BOARD_MKBOOTIMG_ARGS anhängen. Beispiel:

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

Bootloader-Unterstützung

Damit VTS auf Geräten mit Android 10 erfolgreich ausgeführt werden kann, muss der Bootloader das aktualisierte Boot-Image unterstützen und den Kernel-Befehlszeilenparameter androidboot.dtb_idx hinzufügen, um den Index des ausgewählten Gerätebaums (Device Tree, DT) anzugeben. Sie können nur einen Index angeben. Beispielsweise meldet der Parameter androidboot.dtb_idx=NN“ als nullbasierten Index des Gerätebaums, der vom Bootloader aus der Menge der im Boot-Image vorhandenen Gerätebaum-Blobs ausgewählt wurde.