Gambar Pemulihan

Pada perangkat non-A/B, citra pemulihan harus berisi informasi dari blob pohon perangkat (DTB) atau citra overlay Konfigurasi Lanjutan dan Antarmuka Daya (ACPI) . Saat perangkat tersebut melakukan booting ke pemulihan, bootloader kemudian dapat memuat gambar overlay yang kompatibel dengan gambar pemulihan. Perangkat yang mendukung pembaruan A/B (mulus) harus menggunakan pemulihan sebagai boot, bukan partisi pemulihan terpisah (untuk detailnya, lihat Menerapkan Pembaruan A/B ).

Opsi untuk menyertakan DTBO/ACPIO pemulihan sebagai bagian dari image boot/pemulihan berbeda antara rilis Android.

Melepaskan Skema pembaruan kepatuhan GKI Versi header boot (perangkat peluncuran) Versi header boot (meningkatkan perangkat) Diperlukan gambar pemulihan khusus
11 A/B,
A/B maya
Ya 3 * T/A TIDAK
A/B,
A/B maya
TIDAK 2, 3 0, 1, 2, 3 TIDAK
non-A/B Ya 3 T/A Ya
non-A/B TIDAK 2, 3 0, 1, 2, 3 Ya
10 (Q) A/B T/A 2 0, 1, 2 TIDAK
non-A/B T/A 2 0, 1, 2 Ya
9 (P) A/B T/A 1 0, 1 TIDAK
non-A/B T/A 1 0, 1 Ya
8 (HAI) A/B T/A T/A (dianggap 0) T/A (dianggap 0) TIDAK
non-A/B T/A T/A (dianggap 0) T/A (dianggap 0) Ya

* Perangkat A/B yang menjalankan Android 11 atau lebih tinggi dan menggunakan Generic Kernel Image (GKI) harus menggunakan header boot primer versi 3 agar kompatibel dengan partisi boot vendor .

Poin-poin penting:

  • Perangkat A/B tidak perlu menentukan citra pemulihan karena pembaruan A/B menggunakan dua set partisi (termasuk boot dan dtbo ) dan beralih di antara keduanya selama pembaruan, sehingga menghilangkan kebutuhan akan citra pemulihan. Jika diinginkan, perangkat A/B masih dapat menggunakan citra pemulihan khusus.

  • Perangkat non-A/B yang diluncurkan dengan Android 11 atau lebih tinggi dan menggunakan versi header boot 3 harus secara eksplisit menentukan versi header boot 2 untuk image pemulihan secara terpisah. Misalnya:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Untuk arsitektur yang tidak mendukung pohon perangkat, citra pemulihan dapat menyertakan citra ACPIO, bukan citra DTBO.

Tentang kegagalan OTA dan gambar pemulihan

Untuk mencegah kegagalan over-the-air (OTA) pada perangkat non-A/B, citra pemulihan harus mandiri dan tidak bergantung pada citra lainnya. Selama pembaruan OTA, jika masalah terjadi setelah gambar overlay diperbarui (tetapi sebelum menyelesaikan pembaruan penuh), perangkat akan mencoba melakukan booting ke mode pemulihan untuk menyelesaikan pembaruan OTA. Namun karena partisi overlay sudah diperbarui, mungkin terjadi ketidakcocokan dengan image pemulihan (yang belum diperbarui).

Untuk mencegah pemulihan bergantung pada partisi DTBO/ACPIO selama pembaruan, perangkat non-A/B yang menjalankan Android 9 atau lebih tinggi dapat menentukan gambar DTBO/ACPIO pemulihan yang berisi informasi dari gambar overlay sebagai bagian terpisah dalam format gambar boot ( harus menggunakan boot header versi 1 atau 2).

Perubahan gambar boot

Agar image pemulihan berisi DTBO atau ACPIO pemulihan pada perangkat non-A/B yang menjalankan Android 9 atau lebih tinggi, perbarui struktur image booting sebagai berikut.

Bagian gambar boot Jumlah halaman
Header boot (1 halaman) 1
Kernel (l halaman) l = ( kernel_size + page_size - 1) / page_size
Ramdisk (m halaman) m = ( ramdisk_size + page_size - 1) / page_size
Bootloader tahap kedua (n halaman) n = ( second_size + page_size - 1) / page_size
Pemulihan DTBO atau ACPIO (o halaman) o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size

Untuk detail tentang argumen alat mkbootimg untuk menentukan versi header gambar boot dan jalur gambar overlay, lihat Pembuatan Versi Header Gambar Boot .

Menerapkan DTBO

Perangkat non-A/B yang menjalankan versi 9 atau lebih tinggi dapat mengisi bagian recovery_dtbo pada citra pemulihan. Untuk menyertakan gambar recovery_dtbo di recovery.img , di perangkat BoardConfig.mk :

  • Setel konfigurasi BOARD_INCLUDE_RECOVERY_DTBO ke true :

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • Perluas variabel BOARD_MKBOOTIMG_ARGS untuk menentukan versi header gambar boot:

    BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Pastikan variabel BOARD_PREBUILT_DTBOIMAGE diatur ke jalur gambar DTBO. Sistem build Android menggunakan variabel untuk menyetel argumen recovery_dtbo dari alat mkbootimg selama pembuatan image pemulihan.

Jika variabel BOARD_INCLUDE_RECOVERY_DTBO , BOARD_MKBOOTIMG_ARGS , dan BOARD_PREBUILT_DTBOIMAGE disetel dengan benar, sistem build Android akan menyertakan DTBO yang ditentukan oleh variabel BOARD_PREBUILT_DTBOIMAGE di recovery.img .

Menerapkan ACPIO

Perangkat non-A/B yang menjalankan Android 9 atau lebih tinggi dapat menggunakan gambar overlay ACPIO (bukan gambar DTBO) dan dapat mengisi bagian recovery_acpio (bukan bagian recovery_dtbo ) pada gambar pemulihan. Untuk menyertakan gambar recovery_acpio di recovery.img , di perangkat BoardConfig.mk :

  • Setel konfigurasi BOARD_INCLUDE_RECOVERY_ACPIO ke true :

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Perluas variabel BOARD_MKBOOTIMG_ARGS untuk menentukan versi header gambar boot. Variabel harus lebih besar atau sama dengan 1 untuk mendukung pemulihan ACPIO.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Pastikan variabel BOARD_RECOVERY_ACPIO diatur ke jalur gambar ACPIO. Sistem build Android menggunakan variabel untuk menyetel argumen recovery_acpio alat mkbootimg selama pembuatan image pemulihan.

Jika variabel BOARD_INCLUDE_RECOVERY_ACPIO , BOARD_MKBOOTIMG_ARGS , dan BOARD_RECOVERY_ACPIO disetel dengan benar, sistem build Android akan menyertakan ACPIO yang ditentukan oleh variabel BOARD_RECOVERY_ACPIO di recovery.img .