Wiederherstellungsbilder

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

Die Optionen zum Einschließen eines Wiederherstellungs-DTBO/ACPIO als Teil des Start-/Wiederherstellungsabbilds unterscheiden sich zwischen den Android-Versionen.

Freisetzung Schema aktualisieren GKI-Konformität Boot-Header-Version (Geräte starten) Boot-Header-Version (Upgrade von Geräten) Dediziertes Wiederherstellungs-Image erforderlich
11 A/B,
Virtuelles A/B
Jawohl 3 * N / A Nein
A/B,
Virtuelles A/B
Nein 2, 3 0, 1, 2, 3 Nein
Nicht-A/B Jawohl 3 N / A Jawohl
Nicht-A/B Nein 2, 3 0, 1, 2, 3 Jawohl
10 (Q) A/B N / A 2 0, 1, 2 Nein
Nicht-A/B N / A 2 0, 1, 2 Jawohl
9 (P) A/B N / A 1 0, 1 Nein
Nicht-A/B N / A 1 0, 1 Jawohl
8 (O) A/B N / A N/A (als 0 betrachtet) N/A (als 0 betrachtet) Nein
Nicht-A/B N / A N/A (als 0 angesehen) N/A (als 0 angesehen) Jawohl

* A/B-Geräte, auf denen Android 11 oder höher ausgeführt wird und die das generische 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 Wiederherstellungs-Image angeben, da A/B-Updates zwei Sätze von Partitionen (einschließlich boot und dtbo ) verwenden und während der Aktualisierung zwischen ihnen wechseln, sodass kein Wiederherstellungs-Image erforderlich ist. Falls gewünscht, können A/B-Geräte weiterhin ein dediziertes Wiederherstellungs-Image verwenden.

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

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

Informationen zu OTA-Fehlern und Wiederherstellungs-Images

Um Over-the-Air-Ausfälle (OTA) auf Nicht-A/B-Geräten zu verhindern, sollte das Wiederherstellungsabbild autark und unabhängig von anderen Abbildern sein. Wenn während einer OTA-Aktualisierung ein Problem auftritt, nachdem das Overlay-Image aktualisiert wurde (jedoch vor Abschluss der vollständigen Aktualisierung), versucht das Gerät, in den Wiederherstellungsmodus zu booten, um die OTA-Aktualisierung abzuschließen. Da die Overlay-Partition jedoch bereits aktualisiert wurde, kann es zu einer Diskrepanz mit dem Wiederherstellungs-Image kommen (das noch nicht aktualisiert wurde).

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 ändert sich

Damit das Wiederherstellungs-Image 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.

Boot-Image-Abschnitt Seitenzahl
Bootheader (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 Argumenten des mkbootimg Tools zum Angeben der Boot-Image-Header-Version und 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 Wiederherstellungsabbilds füllen. So fügen Sie das recovery_dtbo -Image 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 Header-Version des Boot-Image 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 gesetzt ist. Das Android-Buildsystem verwendet die Variable, um das Argument recovery_dtbo des mkbootimg Tools während der Erstellung des Wiederherstellungsabbilds festzulegen.

Wenn die BOARD_INCLUDE_RECOVERY_DTBO , BOARD_MKBOOTIMG_ARGS und BOARD_PREBUILT_DTBOIMAGE korrekt festgelegt sind, enthält das Android-Buildsystem den DTBO, der durch die Variable BOARD_PREBUILT_DTBOIMAGE in recovery.img angegeben wird.

Implementieren von ACPIO

Nicht-A/B-Geräte mit Android 9 oder höher können ein ACPIO-Overlay-Image (anstelle eines DTBO-Image) verwenden und den Abschnitt recovery_acpio (anstelle des Abschnitts recovery_dtbo ) des Wiederherstellungsabbilds füllen. So fügen Sie das recovery_acpio -Image 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 Kopfzeilenversion des Startabbilds 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 gesetzt ist. Das Android-Buildsystem verwendet die Variable, um das Argument recovery_acpio des mkbootimg Tools während der Erstellung des Wiederherstellungsabbilds festzulegen.

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