Wiederherstellungsbilder

Auf Nicht-A/B-Geräten sollte das Wiederherstellungsimage Informationen aus einem Gerätebaum-Blob (DTB) oder einem ACPI-Overlay-Image (Advanced Configuration and Power Interface) enthalten. Wenn solche Geräte in die Wiederherstellung starten, kann der Bootloader dann das Overlay-Image laden, das mit dem Wiederherstellungs-Image kompatibel ist. Geräte, die A/B-Updates (nahtlose Aktualisierungen) unterstützen, sollten die Wiederherstellung als Start anstelle einer separaten Wiederherstellungspartition verwenden (Einzelheiten finden Sie unter Implementieren von A/B-Updates ).

Die Optionen zum Einbinden eines Wiederherstellungs-DTBO/ACPIO als Teil des Start-/Wiederherstellungsabbilds unterscheiden sich je nach Android-Version.

Freigeben Update-Schema GKI-Konformität Boot-Header-Version (Startgeräte) Boot-Header-Version (Upgrade von Geräten) Dediziertes Wiederherstellungsimage erforderlich
11 A/B,
Virtuelles A/B
Ja 3 * N / A NEIN
A/B,
Virtuelles A/B
NEIN 2, 3 0, 1, 2, 3 NEIN
Nicht-A/B Ja 3 N / A Ja
Nicht-A/B NEIN 2, 3 0, 1, 2, 3 Ja
10 (Q) A/B N / A 2 0, 1, 2 NEIN
Nicht-A/B N / A 2 0, 1, 2 Ja
9 (P) A/B N / A 1 0, 1 NEIN
Nicht-A/B N / A 1 0, 1 Ja
8 (O) A/B N / A N/A (wird als 0 betrachtet) N/A (wird als 0 betrachtet) NEIN
Nicht-A/B N / A N/A (wird als 0 betrachtet) N/A (wird als 0 betrachtet) Ja

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

Kernpunkte:

  • A/B-Geräte müssen kein Wiederherstellungsimage angeben, da A/B-Updates zwei Partitionssätze (einschließlich boot und dtbo ) verwenden und während der Updates zwischen diesen wechseln, sodass kein Wiederherstellungsimage erforderlich ist. Auf Wunsch können A/B-Geräte weiterhin ein dediziertes Wiederherstellungsimage verwenden.

  • Nicht-A/B-Geräte, die mit Android 11 oder höher gestartet werden und eine Boot-Header-Version 3 verwenden, müssen explizit separat eine Boot-Header-Version 2 für das Wiederherstellungsimage angeben. Zum Beispiel:

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

Über OTA-Fehler und Wiederherstellungsimages

Um Over-the-Air-Ausfälle (OTA) auf Nicht-A/B-Geräten zu verhindern, sollte das Wiederherstellungsimage autark und unabhängig von anderen Images sein. Wenn während eines OTA-Updates ein Problem auftritt, nachdem das Overlay-Image aktualisiert wurde (jedoch vor Abschluss des vollständigen Updates), 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 Nichtübereinstimmung mit dem Wiederherstellungsimage (das noch nicht aktualisiert wurde) kommen.

Um zu verhindern, dass die Wiederherstellung während eines Updates von der DTBO/ACPIO-Partition abhängt, können Nicht-A/B-Geräte mit Android 9 oder höher ein Wiederherstellungs-DTBO/ACPIO-Image angeben, das Informationen aus dem Overlay-Image als separaten Abschnitt im Boot-Image-Format enthält ( muss eine Boot-Header-Version von 1 oder 2 verwenden).

Boot-Image-Änderungen

Damit das Wiederherstellungsimage das Wiederherstellungs-DTBO oder ACPIO auf Nicht-A/B-Geräten mit Android 9 oder höher enthalten kann, aktualisieren Sie die Boot-Image-Struktur wie folgt.

Abschnitt „Boot-Image“. Seitenzahl
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
Wiederherstellung DTBO oder ACPIO (o Seiten) o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size

Einzelheiten zu den mkbootimg Tool-Argumenten zum Angeben der Boot-Image-Header-Version und der Overlay-Image-Pfade finden Sie unter Boot-Image-Header-Versionierung .

Implementierung von DTBO

Nicht-A/B-Geräte mit Version 9 oder höher können den Abschnitt recovery_dtbo des Wiederherstellungsimages füllen. So fügen Sie das Bild recovery_dtbo in recovery.img im Gerät BoardConfig.mk ein:

  • Setzen Sie die Konfiguration BOARD_INCLUDE_RECOVERY_DTBO auf true :

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

    BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Stellen Sie sicher, dass die Variable BOARD_PREBUILT_DTBOIMAGE auf den Pfad des DTBO-Images festgelegt ist. Das Android-Build-System verwendet die Variable, um das Argument recovery_dtbo “ des Tools mkbootimg “ während der Erstellung des Wiederherstellungsimages festzulegen.

Wenn die Variablen BOARD_INCLUDE_RECOVERY_DTBO , BOARD_MKBOOTIMG_ARGS und BOARD_PREBUILT_DTBOIMAGE korrekt festgelegt sind, schließt das Android-Build-System das DTBO ein, das durch die Variable BOARD_PREBUILT_DTBOIMAGE in recovery.img angegeben wird.

Implementierung von ACPIO

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

  • Setzen Sie die Konfiguration BOARD_INCLUDE_RECOVERY_ACPIO auf true :

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Erweitern Sie die Variable BOARD_MKBOOTIMG_ARGS , um die Boot-Image-Header-Version anzugeben. Die Variable muss größer oder gleich 1 sein, um Wiederherstellungs-ACPIO zu unterstützen.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Stellen Sie sicher, dass die Variable BOARD_RECOVERY_ACPIO auf den Pfad des ACPIO-Images eingestellt ist. Das Android-Build-System verwendet die Variable, um das Argument recovery_acpio “ des Tools mkbootimg “ während der Erstellung des Wiederherstellungsimages festzulegen.

Wenn die Variablen BOARD_INCLUDE_RECOVERY_ACPIO , BOARD_MKBOOTIMG_ARGS und BOARD_RECOVERY_ACPIO richtig eingestellt sind, schließt das Android-Build-System den ACPIO ein, der durch die Variable BOARD_RECOVERY_ACPIO in recovery.img angegeben wird.