Mendukung Pembaruan OTA

Untuk mendukung pembaruan over-the-air (OTA) , bootloader harus dapat mengakses disk RAM pemulihan saat boot. Jika perangkat menggunakan image pemulihan AOSP yang tidak dimodifikasi, bootloader membaca 32 byte pertama pada partisi misc ; jika data di sana cocok dengan boot-recovery , bootloader akan melakukan booting ke image recovery . Metode ini memungkinkan pekerjaan pemulihan apa pun yang tertunda (misalnya, menerapkan OTA atau menghapus data) untuk dilanjutkan hingga selesai.

Untuk detail tentang konten blok di flash yang digunakan untuk komunikasi dengan pemulihan dan bootloader, lihat bootable/recovery/bootloader_message/bootloader_message.h .

Perangkat dengan pembaruan A/B

Untuk mendukung pembaruan OTA pada perangkat yang menggunakan pembaruan A/B , pastikan bootloader perangkat memenuhi kriteria berikut.

Kriteria umum

  • Semua partisi yang diperbarui melalui OTA harus dapat diperbarui saat sistem utama di-boot (dan tidak diperbarui dalam pemulihan).

  • Untuk mem-boot partisi system , bootloader meneruskan nilai berikut pada baris perintah kernel: ro root=/dev/[node] rootwait init=/init .

  • Kerangka kerja Android bertanggung jawab untuk memanggil markBootSuccessful dari HAL. Bootloader tidak boleh menandai partisi yang berhasil di-boot.

Dukungan untuk kontrol boot HAL

Bootloader harus mendukung boot_control HAL sebagaimana didefinisikan dalam hardware/libhardware/include/hardware/boot_control.h ). Pembaru menanyakan kontrol boot HAL , memperbarui slot boot yang saat ini tidak digunakan, mengubah slot aktif menggunakan HAL, dan mem-boot ulang ke sistem operasi yang diperbarui. Untuk detailnya, lihat Menerapkan kontrol boot HAL .

Dukungan untuk slot

Bootloader harus mendukung fungsionalitas terkait partisi dan slot, antara lain:

  • Nama partisi harus menyertakan akhiran yang mengidentifikasi partisi mana yang termasuk dalam slot tertentu di bootloader. Untuk setiap partisi tersebut, terdapat variabel has-slot: partition base name yang sesuai dengan nilai yes . Slot diberi nama berdasarkan abjad sebagai a, b, c, dll. sesuai dengan partisi dengan akhiran _a , _b , _c , dll. Bootloader harus memberi tahu sistem operasi slot mana yang di-boot menggunakan properti baris perintah androidboot.slot_suffix . Properti ini disetel melalui bootconfig untuk perangkat yang diluncurkan dengan Android 12 atau lebih baru.

  • Nilai slot-retry-count diatur ulang ke nilai positif (biasanya 3 ), baik oleh kontrol boot HAL melalui panggilan balik setActiveBootSlot atau melalui perintah fastboot set_active . Saat memodifikasi partisi yang merupakan bagian dari slot, bootloader akan menghapus "berhasil di-boot" dan mengatur ulang jumlah percobaan ulang untuk slot tersebut.

Bootloader juga harus menentukan slot mana yang akan dimuat. Gambar tersebut menunjukkan contoh proses pengambilan keputusan.

Alur slot bootloader
Gambar 1. Alur slotting bootloader
  1. Tentukan slot mana yang akan dicoba. Jangan mencoba memuat slot bertanda slot-unbootable . Slot ini harus konsisten dengan nilai yang dikembalikan oleh fastboot, dan disebut sebagai slot saat ini.

  2. Jika slot saat ini tidak ditandai sebagai slot-successful dan memiliki slot-retry-count = 0 , tandai slot saat ini sebagai slot-unbootable . Kemudian pilih slot lain yang tidak ditandai unbootable dan ditandai sebagai slot-successful ; slot ini sekarang menjadi slot yang dipilih. Jika tidak ada slot saat ini yang tersedia, boot ke pemulihan atau tampilkan pesan kesalahan yang berarti kepada pengguna.

  3. Pilih boot.img yang sesuai dan sertakan jalur ke partisi sistem yang benar pada baris perintah kernel.

  4. Isi parameter slot_suffix baris perintah kernel.

  5. sepatu bot. Jika tidak ditandai slot-successful , kurangi slot-retry-count .

Utilitas fastboot menentukan partisi mana yang akan di-flash ketika menjalankan perintah flash apa pun. Misalnya, menjalankan perintah fastboot flash system system.img terlebih dahulu menanyakan variabel current-slot kemudian menggabungkan hasilnya ke sistem untuk menghasilkan nama partisi yang harus di-flash ( system_a , system_b , dll.).

Saat mengatur slot saat ini menggunakan perintah fastboot set_active atau perintah boot control HAL setActiveBootSlot , bootloader harus memperbarui slot saat ini, menghapus slot-unbootable dan slot-successful , dan mengatur ulang jumlah percobaan ulang (ini adalah satu-satunya cara untuk menghapus slot-unbootable ).

Perangkat tanpa pembaruan A/B

Untuk mendukung pembaruan OTA pada perangkat yang tidak menggunakan pembaruan A/B (lihat Perangkat yang dapat diperbarui non-A/B ), pastikan bootloader perangkat memenuhi kriteria berikut.

  • Partisi recovery harus berisi citra yang mampu membaca citra sistem dari beberapa partisi yang didukung ( cache , userdata ) dan menulisnya ke partisi system .

  • Bootloader harus mendukung reboot langsung ke mode pemulihan.

  • Jika pembaruan citra radio didukung, partisi recovery juga harus dapat mem-flash radio. Hal ini dapat dicapai dengan salah satu dari dua cara berikut:

    • Bootloader mem-flash radio. Dalam hal ini, dimungkinkan untuk melakukan boot ulang dari partisi pemulihan kembali ke bootloader untuk menyelesaikan pembaruan.

    • Gambar pemulihan mem-flash radio. Fungsionalitas ini dapat disediakan sebagai perpustakaan biner atau utilitas.