Wiederherstellungs-Images

Auf Nicht-A/B-Geräten sollte das Wiederherstellungsimage Informationen aus einem Device Tree Blob (DTB) oder einem Overlay-Image der Advanced Configuration and Power Interface (ACPI) enthalten. Wenn solche Geräte bei der Wiederherstellung gestartet werden, kann der Bootloader das Overlay-Image laden, das mit dem Wiederherstellungs-Image kompatibel ist. Bei Geräten, die A/B-Updates (nahtlos) unterstützen, sollte die Wiederherstellung zum Starten verwendet werden, anstatt eine separate Wiederherstellungspartition. Weitere Informationen finden Sie unter A/B-Updates implementieren.

Die Optionen zum Einbeziehen eines Recovery-DTBO/ACPIO als Teil des Boot-/Recovery-Images unterscheiden sich zwischen den Android-Releases.

Release Schema aktualisieren GKI-Compliance Header-Version Boot (starten von Geräten) Boot-Header-Version (Geräte mit Upgrade) Spezielles Wiederherstellungs-Image erforderlich
11 A/B,
Virtuelles A/B
Ja 3* Nein
A/B,
virtueller A/B
Nein 2, 3 0, 1, 2, 3 Nein
Nicht-A/B- Ja 3 Ja
Nicht A/B Nein 2, 3 0, 1, 2, 3 Ja
10 (F) A/B 2 0, 1, 2 Nein
Nicht-A/B- 2 0, 1, 2 Ja
9 (P) A/B-Tests 1 0, 1 Nein
Nicht-A/B- 1 0, 1 Ja
8 (O) A/B – (erfasst 0) – (wird als 0 betrachtet) Nein
Nicht-A/B- – (erfasst 0) – (wird als 0 betrachtet) Ja

* A/B-Geräte mit Android 11 oder höher und dem Generic Kernel Image (GKI) müssen eine primäre Boot-Header-Version 3 verwenden, um mit der Boot-Partition des Anbieters kompatibel zu sein.

Wichtige Punkte:

  • Für A/B-Geräte muss kein Wiederherstellungs-Image angegeben werden, da A/B-Updates zwei Partitionen (einschließlich boot und dtbo) verwenden und während der Updates zwischen ihnen wechseln. Ein Wiederherstellungs-Image ist daher nicht erforderlich. A/B-Geräte können weiterhin ein spezielles Wiederherstellungsimage verwenden.

  • Für Nicht-A/B-Geräte, die mit Android 11 oder höher auf den Markt gebracht werden und die Boot-Header-Version 3 verwenden, muss für das Wiederherstellungs-Image separat eine Boot-Header-Version 2 angegeben werden. Beispiel:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Bei Architekturen, die keine Gerätestrukturen unterstützen, kann das Wiederherstellungs-Image ein ACPIO-Image anstelle eines DTBO-Images enthalten.

Informationen zu OTA-Fehlern und Wiederherstellungs-Images

Um Over-the-air-Fehler (OTA) auf Nicht-A/B-Geräten zu vermeiden, sollte das Wiederherstellungs-Image autark und unabhängig von anderen Images sein. Wenn während eines OTA-Updates ein Problem auftritt, nachdem das Overlay-Image aktualisiert wurde, aber bevor das vollständige Update abgeschlossen wurde, versucht das Gerät, im Wiederherstellungsmodus zu starten, um das OTA-Update abzuschließen. Da die Overlay-Partition jedoch bereits aktualisiert wurde, kann es zu einer Abweichung mit dem Wiederherstellungs-Image kommen, das noch nicht aktualisiert wurde.

Damit die Wiederherstellung nicht von der DTBO/ACPIO-Partition während eines Updates abhängig ist, können Geräte ohne A/B-Partition, auf denen Android 9 oder höher ausgeführt wird, ein DTBO/ACPIO-Wiederherstellungs-Image mit Informationen aus dem Overlay-Image als separaten Abschnitt im Boot-Image-Format angeben. Dabei muss eine Boot-Header-Version von 1 oder 2 verwendet werden.

Änderungen am Boot-Image

Damit das Wiederherstellungs-Image das DTBO oder ACPIO für die Wiederherstellung auf Nicht-A/B-Geräten mit Android 9 oder höher enthalten kann, aktualisieren Sie die Boot-Image-Struktur so:

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 Stufe (n Seiten) n = (second_size + page_size - 1) ÷ page_size
Wiederherstellungs-DTBO oder ACPIO (o-Seiten) o = (recovery_[dtbo|acpio]_size + page_size – 1) / page_size

Weitere Informationen zu den Argumenten des mkbootimg-Tools zum Angeben der Boot-Image-Headerversion und der Overlay-Image-Pfade finden Sie unter Versionierung des Boot-Image-Headers.

DTBO implementieren

Bei Nicht-A/B-Geräten mit Android 9 oder höher kann der Bereich recovery_dtbo des Wiederherstellungsimages ausgefüllt werden. So fügen Sie das recovery_dtbo-Image in recovery.img auf dem Gerät BoardConfig.mk ein:

  • Legen Sie die Konfiguration BOARD_INCLUDE_RECOVERY_DTBO auf true fest:

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • Erweitern Sie die Variable BOARD_MKBOOTIMG_ARGS, um die Version der Boot-Image-Kopfzeile anzugeben:

    BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Die Variable BOARD_PREBUILT_DTBOIMAGE muss auf den Pfad des DTBO-Images festgelegt sein. Das Android-Build-System verwendet die Variable, um das recovery_dtbo-Argument des mkbootimg-Tools beim Erstellen des Wiederherstellungs-Images festzulegen.

Wenn die Variablen BOARD_INCLUDE_RECOVERY_DTBO, BOARD_MKBOOTIMG_ARGS und BOARD_PREBUILT_DTBOIMAGE richtig festgelegt sind, enthält das Android-Build-System die DTBO, die durch die Variable BOARD_PREBUILT_DTBOIMAGE in recovery.img angegeben ist.

ACPIO implementieren

Nicht-A/B-Geräte mit Android 9 oder höher können ein ACPIO-Overlay-Image (anstelle eines DTBO-Images) verwenden und den Bereich recovery_acpio (anstelle des Bereichs recovery_dtbo) des Wiederherstellungs-Images ausfüllen. So fügen Sie das Image recovery_acpio in recovery.img im Gerät BoardConfig.mk ein:

  • Legen Sie die Konfiguration BOARD_INCLUDE_RECOVERY_ACPIO auf true fest:

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Erweitern Sie die Variable BOARD_MKBOOTIMG_ARGS, um die Headerversion des Boot-Images anzugeben. Die Variable muss größer oder gleich 1 sein, um die Wiederherstellung von ACPIO zu unterstützen.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Die Variable BOARD_RECOVERY_ACPIO muss auf den Pfad des ACPIO-Images festgelegt sein. Das Android-Build-System verwendet die Variable, um das recovery_acpio-Argument des mkbootimg-Tools beim Erstellen des Wiederherstellungs-Images festzulegen.

Wenn die Variablen BOARD_INCLUDE_RECOVERY_ACPIO, BOARD_MKBOOTIMG_ARGS und BOARD_RECOVERY_ACPIO richtig festgelegt sind, enthält das Android-Build-System die ACPIO, die in recovery.img durch die Variable BOARD_RECOVERY_ACPIO angegeben ist.