Mengimplementasikan update OTA

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

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

Perangkat dengan update A/B

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

Kriteria umum

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

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

  • Framework Android bertanggung jawab untuk memanggil markBootSuccessful dari HAL. Bootloader tidak boleh menandai partisi sebagai berhasil di-boot.

Dukungan untuk HAL kontrol booting

Bootloader harus mendukung HAL boot_control sebagaimana ditentukan dalam hardware/libhardware/include/hardware/boot_control.h. Pengupdate mengkueri HAL kontrol booting, mengupdate slot booting yang tidak digunakan, mengubah slot aktif menggunakan HAL, dan melakukan booting ulang ke sistem operasi yang diupdate. Untuk mengetahui detailnya, lihat Menerapkan HAL kontrol booting.

Dukungan untuk slot

Bootloader harus mendukung fungsi terkait partisi dan slot, termasuk:

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

  • Nilai slot-retry-count direset ke nilai positif (biasanya 3), baik oleh HAL kontrol booting melalui callback setActiveBootSlot atau melalui perintah fastboot set_active. Saat mengubah partisi yang merupakan bagian dari slot, bootloader akan menghapus "berhasil di-boot" dan mereset jumlah percobaan ulang untuk slot.

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

Alur penempatan bootloader
Gambar 1. Alur penempatan slot bootloader
  1. Tentukan slot yang akan dicoba. Jangan mencoba memuat slot yang ditandai slot-unbootable. Slot ini harus konsisten dengan nilai yang ditampilkan 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, lakukan booting ke pemulihan atau tampilkan pesan error yang bermakna kepada pengguna.

  3. Pilih boot.img yang sesuai dan sertakan jalur ke partisi sistem yang benar di command line kernel.

  4. Isi parameter command line kernel slot_suffix.

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

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

Saat menyetel slot saat ini menggunakan perintah fastboot set_active atau perintah HAL kontrol booting setActiveBootSlot, bootloader harus memperbarui slot saat ini, menghapus slot-unbootable dan slot-successful, serta mereset jumlah percobaan ulang (ini adalah satu-satunya cara untuk menghapus slot-unbootable).

Perangkat tanpa update A/B

Untuk mendukung update OTA di perangkat yang tidak menggunakan update A/B (lihat Perangkat yang dapat diupdate Non-A/B), pastikan bootloader perangkat memenuhi kriteria berikut.

  • Partisi recovery harus berisi image yang dapat membaca image sistem dari beberapa partisi yang didukung (cache, userdata) dan menuliskannya ke partisi system.

  • Bootloader harus mendukung booting langsung ke mode pemulihan.

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

    • Bootloader mem-flash radio. Dalam hal ini, Anda dapat melakukan reboot dari partisi pemulihan kembali ke bootloader untuk menyelesaikan update.

    • Gambar pemulihan mem-flash radio. Fungsi ini dapat disediakan sebagai library atau utilitas biner.