Gambar Pemulihan

Pada perangkat non-A/B, image pemulihan harus berisi informasi dari device tree blob (DTB) atau image overlay Konfigurasi Lanjut dan Antarmuka Daya (ACPI) . Saat perangkat tersebut boot 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 alih-alih partisi pemulihan terpisah (untuk detailnya, lihat Menerapkan Pembaruan A/B ).

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

Melepaskan Perbarui skema kepatuhan GKI Versi header boot (perangkat peluncuran) Versi header boot (mengupgrade perangkat) Diperlukan gambar pemulihan khusus
11 A/B,
Virtual A/B
Ya 3 * T/A Tidak
A/B,
Virtual A/B
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 (T) 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 lebih tinggi dan menggunakan Generic Kernel Image (GKI) harus menggunakan header boot primer versi 3 agar kompatibel dengan partisi boot vendor .

Poin kunci:

  • Perangkat A/B tidak perlu menentukan gambar pemulihan karena pembaruan A/B menggunakan dua set partisi (termasuk boot dan dtbo ) dan beralih di antara mereka selama pembaruan, menghilangkan kebutuhan akan gambar 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. Sebagai contoh:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Untuk arsitektur yang tidak mendukung pohon perangkat, gambar pemulihan dapat menyertakan gambar ACPIO, bukan gambar 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 lain. Selama pembaruan OTA, jika masalah terjadi setelah gambar overlay diperbarui (tetapi sebelum menyelesaikan pembaruan penuh), perangkat mencoba untuk boot ke mode pemulihan untuk menyelesaikan pembaruan OTA. Namun, karena partisi overlay telah diperbarui, ketidakcocokan dapat terjadi dengan gambar 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 image DTBO/ACPIO pemulihan yang berisi informasi dari image overlay sebagai bagian terpisah dalam format image booting ( harus menggunakan versi header boot 1 atau 2).

Perubahan gambar boot

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

Bagian gambar boot Jumlah halaman
Judul 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 image boot dan jalur image overlay, lihat Versi Boot Image Header .

Menerapkan DTBO

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

  • Setel konfigurasi BOARD_INCLUDE_RECOVERY_DTBO menjadi 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 bahwa variabel BOARD_PREBUILT_DTBOIMAGE diatur ke jalur gambar DTBO. Sistem pembangunan Android menggunakan variabel untuk menyetel argumen recovery_dtbo dari alat mkbootimg selama pembuatan citra pemulihan.

Jika BOARD_INCLUDE_RECOVERY_DTBO , BOARD_MKBOOTIMG_ARGS , dan BOARD_PREBUILT_DTBOIMAGE disetel dengan benar, sistem pembangunan Android 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 ) dari gambar pemulihan. Untuk menyertakan image recovery_acpio di recovery.img , di perangkat BoardConfig.mk :

  • Setel konfigurasi BOARD_INCLUDE_RECOVERY_ACPIO menjadi true :

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

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

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