Image pemulihan

Pada perangkat non-A/B, image pemulihan harus berisi informasi dari blob hierarki perangkat (DTB) atau Advanced Configuration and Power Interface (ACPI) overlay image. Saat perangkat tersebut melakukan booting ke pemulihan, bootloader kemudian dapat memuat image overlay yang kompatibel dengan image pemulihan. Perangkat yang mendukung A/B (mulus) update harus menggunakan pemulihan sebagai booting, bukan partisi pemulihan terpisah (untuk detailnya, lihat Menerapkan A/B) Info Terbaru).

Opsi untuk menyertakan DTBO/ACPIO pemulihan sebagai bagian dari image booting/pemulihan berbeda-beda di antara rilis Android.

Rilis Perbarui skema Kepatuhan GKI Versi header booting (perangkat peluncuran) Versi header booting (mengupgrade perangkat) Diperlukan image pemulihan khusus
11 A/B,
A/B Virtual
Ya 3* T/A Tidak
A/B,
A/B Virtual
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 (O) 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 yang lebih baru dan menggunakan Generic Kernel Image (GKI) harus menggunakan header booting versi utama 3 agar kompatibel dengan partisi booting vendor.

Poin utama:

  • Perangkat A/B tidak perlu menentukan image pemulihan karena update A/B menggunakan dua kumpulan partisi (termasuk boot dan dtbo) dan beralih di antara keduanya selama update, sehingga tidak memerlukan image pemulihan. Perangkat A/B masih dapat menggunakan image pemulihan khusus.

  • Perangkat non-A/B yang diluncurkan dengan Android 11 atau yang lebih baru dan penggunaan header booting versi 3 harus secara eksplisit menentukan header booting versi 2 untuk gambar pemulihan secara terpisah. Contoh:

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

Tentang kegagalan OTA dan image pemulihan

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

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

Perubahan image booting

Untuk memungkinkan gambar pemulihan berisi DTBO atau ACPIO pemulihan di non-A/B perangkat yang menjalankan Android 9 atau yang lebih tinggi, update booting struktur gambar sebagai berikut.

Bagian image booting Jumlah halaman
Header booting (1 halaman) 1
{i>Kernel<i} (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
DTBO atau ACPIO pemulihan (o halaman) o = (recovery_[dtbo|acpio]_size + page_size - 1) / page_size

Untuk mengetahui detail tentang argumen alat mkbootimg guna menentukan versi header gambar booting dan jalur gambar overlay, lihat Pembuatan Versi Header Gambar Booting.

Menerapkan DTBO

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

  • Tetapkan konfigurasi BOARD_INCLUDE_RECOVERY_DTBO ke true:

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • Luaskan variabel BOARD_MKBOOTIMG_ARGS untuk menentukan versi header gambar booting:

    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 ditetapkan ke jalur gambar DTBO. Sistem build Android menggunakan variabel untuk menetapkan argumen recovery_dtbo alat mkbootimg selama pembuatan image pemulihan.

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

Mengimplementasikan ACPIO

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

  • Tetapkan konfigurasi BOARD_INCLUDE_RECOVERY_ACPIO ke true:

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Perluas variabel BOARD_MKBOOTIMG_ARGS untuk menentukan header image booting . Variabel harus lebih besar dari atau sama dengan 1 untuk mendukung pemulihan ACPIO.

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

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