Mit Android 9 wurde ein Versionsfeld in den Boot-Image-Header eingeführt, das Updates am Header ermöglicht und gleichzeitig die Abwärtskompatibilität beibehält. Der Bootloader muss das Feld „Header-Version“ prüfen und den Header entsprechend parsen. Geräte, die mit Folgendem gestartet werden:
- Android 13 kann die Bootheader-Version 3 oder 4 verwenden. Bei Geräten, die die Generic Kernel Image (GKI)-Architektur unterstützen, ist Version 4 das primäre Boot-Image und das Feld
os_version
im Boot-Header muss null sein. Der Geräte-Bootloader soll die Versionsinformationen stattdessen aus den Android Verified Boot (AVB)-Eigenschaften abrufen. - Unter Android 12 kann die Bootheader-Version 3 oder 4 verwendet werden. Bei Geräten, die die Generic Kernel Image (GKI)-Architektur unterstützen, ist Version 4 das primäre Boot-Image.
- Android 11 kann die Boot-Header-Version 3 verwenden. Bei Geräten, die die Architektur des Generic Kernel Image (GKI) unterstützen, muss diese Version für das primäre Boot-Image verwendet werden.
- Für Android 10 muss die Boot-Header-Version 2 verwendet werden.
- Für Android 9 muss die Boot-Header-Version 1 verwendet werden.
- Bei Android 8 und niedriger wird davon ausgegangen, dass die Boot-Image-Headerversion 0 verwendet wird.
Bei allen Geräten mit Android 9 oder höher prüft die Vendor Test Suite (VTS) das Format des boot/recovery
-Images, um sicherzustellen, dass der Boot-Image-Header die richtige Version verwendet. AOSP-Details zu allen unterstützten Boot- und Anbieter-Boot-Image-Headern finden Sie unter system/tools/mkbootimg/include/bootimg/bootimg.h
.
Versionierung des Boot-Image-Headers implementieren
Das mkbootimg
-Tool akzeptiert die folgenden Argumente.
Argumentation | Beschreibung |
---|---|
header_version |
Legt die Version der Boot-Image-Kopfzeile fest. Ein Boot-Image mit einer Headerversion:
|
recovery_dtbo |
Wird für Architekturen verwendet, die DTB verwenden. Gibt den Pfad zum DTBO-Image für die Wiederherstellung an. Optional für A/B-Geräte, für die kein Wiederherstellungs-Image erforderlich ist.
Nicht A/B-Geräte, die header_version verwenden:
|
recovery_acpio |
Wird für Architekturen verwendet, die ACPI anstelle von DTB verwenden. Gibt den Pfad zum ACPIO-Image für die Wiederherstellung an. Optional für A/B-Geräte, die kein Wiederherstellungsimage benötigen. Nicht A/B-Geräte, die header_version verwenden:
|
dtb |
Pfad zum DTB-Image, das in den Boot-/Wiederherstellungs-Images enthalten ist. |
dtb_offset |
Wenn dem Argument base hinzugefügt, gibt die physische Ladeadresse für den endgültigen Gerätebaum an. Wenn das base -Argument beispielsweise 0x10000000 und das dtb_offset -Argument 0x01000000 ist, wird dtb_addr_field im Boot-Image-Header als 0x11000000 ausgefüllt. |
Das Gerät BoardConfig.mk
verwendet die Konfiguration BOARD_MKBOOTIMG_ARGS
, um den anderen plattformspezifischen Argumenten von mkbootimg
header version
hinzuzufügen. Beispiel:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Das Android-Build-System verwendet die BoardConfig
-Variable BOARD_PREBUILT_DTBOIMAGE
, um beim Erstellen des Wiederherstellungs-Images das Argument recovery_dtbo
des mkbootimg
-Tools festzulegen. Weitere Informationen zu den Änderungen am Android Open Source Project (AOSP) finden Sie in den zugehörigen Änderungslisten für die Versionierung von Boot-Image-Headern.
Boot-Image-Header, Version 4
Android 12 stellt eine boot_signature
im Boot-Image-Header Version 4 bereit, mit der die Integrität des Kernels und der Ramdisk geprüft werden kann. Die Prüfung erfolgt in VtsSecurityAvbTest und ist für Geräte mit GKI-Architektur erforderlich. boot_signature
ist jedoch nicht am gerätespezifischen verifizierten Bootvorgang beteiligt und wird nur in VTS verwendet. Weitere Informationen finden Sie unter GKI-Boot.img-Boardkonfiguration und GKI-Einstellungen für den bestätigten Start.
Die Version 4 des Boot-Image-Headers des Anbieters unterstützt mehrere Ramdisk-Fragmente des Anbieters.
Version 4 der Boot-Image-Header-Version hat das folgende Format.
struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t ramdisk_size; /* size in bytes */
uint32_t os_version;
uint32_t header_size; /* size of boot image header in bytes */
uint32_t reserved[4];
uint32_t header_version; /* offset remains constant for version check */
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
uint32_t signature_size; /* size in bytes */
};
Boot-Image-Header, Version 3
In Android 11 wird der Boot-Image-Header auf Version 3 aktualisiert. Dabei werden die folgenden Daten entfernt:
Bootloader der zweiten Stufe Die Felder
second_size
undsecond_addr
werden nicht mehr im Boot-Image-Header angezeigt. Geräte mit einem Bootloader in der zweiten Phase müssen diesen Bootloader in einer eigenen Partition speichern.Wiederherstellungsimage Die Anforderung zur Angabe eines Wiederherstellungs-Images wurde eingestellt und die Felder
recovery_dtbo_size
,recovery_dtbo_offset
,recovery_acpio_size
undrecovery_acpio_offset
sind nicht mehr im Boot-Image-Header enthalten.A/B-Geräte verwenden ein Update- und Wiederherstellungsschema, bei dem kein DTBO- oder ACPIO-Image für die Wiederherstellung angegeben werden muss.
Für Nicht-A/B-Geräte, für die ein Wiederherstellungs-Image (entweder DTBO oder ACPIO) angegeben werden soll, sollte die Boot-Image-Header-Version 1 oder 2 verwendet werden.
Device Tree Blob (DTB) Das DTB wird in der Bootpartition des Anbieters gespeichert. Die Felder
dtb_size
unddtb_addr
sind daher nicht mehr im Boot-Image-Header zu sehen, sondern im Header des Boot-Images des Anbieters.
Geräte können die Boot-Image-Header-Version 3 verwenden, um der Architektur Generic Kernel Image (GKI) zu entsprechen, die den Kern-Kernel vereinheitlicht und die für den Start erforderlichen Anbietermodule in die Partition vendor_boot
verschiebt (d. h., das Boot-Image enthält nur GKI-Komponenten). Geräte, auf die Folgendes zutrifft:
Wenn Sie GKI verwenden (erfordert den Kernel Android 4.19 oder Android 5.4), aber keine A/B-Updates, können Sie ein Wiederherstellungsimage angeben, indem Sie das Start-Image der Version 3 für das Boot-Image und die Boot-Image-Version 2 als Wiederherstellungsabbild verwenden.
Wenn Sie GKI und A/B-Updates nicht verwenden, können Sie ein Wiederherstellungs-Image angeben, indem Sie die Boot-Image-Version 1 oder 2 sowohl für das Boot- als auch für das Wiederherstellungs-Image verwenden.
Version 3 der Boot-Image-Headerversion verwendet das folgende Format.
struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t ramdisk_size; /* size in bytes */
uint32_t os_version;
uint32_t header_size; /* size of boot image header in bytes */
uint32_t reserved[4];
uint32_t header_version; /* offset remains constant for version check */
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
};
Boot-Image-Header, Version 2
In Android 10 wird der Boot-Image-Header auf Version 2 aktualisiert. Dadurch wird ein Abschnitt für Informationen zum DTB-Image der Wiederherstellung (Image-Größe und physische Ladeadresse) hinzugefügt.
Version 2 der Boot-Image-Headerversion verwendet das folgende Format.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t header_version;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
uint32_t recovery_[dtbo|acpio]_size; /* size of recovery image */
uint64_t recovery_[dtbo|acpio]_offset; /* offset in boot image */
uint32_t header_size; /* size of boot image header in bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
};
Boot-Image-Header, Version 1
Android 9 konvertiert das Feld unused
des Boot-Image-Headers in ein Header-Versionsfeld. Geräte, die mit Android 9 auf den Markt gebracht werden, müssen den Boot-Image-Header mit der Header-Version 1 oder höher verwenden. Dies wird von VTS überprüft.
Version 1 der Boot-Image-Headerversion verwendet das folgende Format.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t header_version;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
uint32_t recovery_[dtbo|acpio]_size; /* size of recovery image */
uint64_t recovery_[dtbo|acpio]_offset; /* offset in boot image */
uint32_t header_size; /* size of boot image header in bytes */
};
Bei Nicht-A/B-Geräten kann ein DTB/ACPI-Overlay-Image für die Wiederherstellung angegeben werden, um Fehlschläge bei Over-the-Air-Updates (OTA) zu vermeiden. Bei A/B-Geräten tritt dieses Problem nicht auf und es muss kein Overlay-Bild angegeben werden. Sie können entweder ein DTBO-Image oder ein ACPIO-Image angeben, aber nicht beides (da sie von verschiedenen Architekturen verwendet werden). So konfigurieren Sie den Boot-Image-Header richtig, wenn Sie Folgendes verwenden:
Ein DTBO-Image für die Wiederherstellung muss die Felder
recovery_dtbo_size
undrecovery_dtbo_offset
enthalten, aber nicht die Felderrecovery_acpio_size
undrecovery_acpio_offset
.Ein ACPIO-Image für die Wiederherstellung muss die Felder
recovery_acpio_size
undrecovery_acpio_offset
enthalten, aber nicht die Felderrecovery_dtbo_size
undrecovery_dtbo_offset
.
Das Feld header_size
enthält die Größe der Boot-Image-Kopfzeile. Wenn die Headerversion des Boot-Images auf 1 festgelegt ist, enthält das Feld id
zusätzlich zu kernel
, ramdisk
und second sections
den SHA-1-Digest für den Abschnitt recovery_[dtbo|acpio]
des Boot-Images. Weitere Informationen zu den Feldern recovery_[dtbo|acpio]_size
und recovery_[dtbo|acpio]_offset
finden Sie unter Wiederherstellungs-Images.
Legacy-Boot-Image-Header, Version 0
Bei Geräten, die vor Android 9 auf den alten Boot-Image-Header zurückgreifen, wird davon ausgegangen, dass sie den Boot-Image-Header der Version 0 verwenden.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t unused;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
};