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 pada partisi misc; jika data di sana cocok dengan boot-recovery, bootloader akan melakukan booting ke image recovery. Metode ini memungkinkan semua pekerjaan pemulihan yang tertunda (misalnya, menerapkan OTA atau menghapus data) untuk terus diselesaikan.

Untuk detail tentang konten blok dalam 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-booting (dan tidak diupdate dalam pemulihan).

  • Untuk mem-booting 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-booting.

Dukungan untuk HAL kontrol booting

Bootloader harus mendukung HAL boot_control seperti yang ditentukan dalam hardware/libhardware/include/hardware/boot_control.h. Updater membuat kueri boot control HAL, mengupdate slot booting yang tidak digunakan, mengubah slot aktif menggunakan HAL, dan memulai ulang ke sistem operasi yang telah diupdate. Untuk mengetahui detailnya, lihat Mengimplementasikan HAL kontrol boot.

Dukungan untuk slot

Bootloader harus mendukung fungsi yang terkait dengan partisi dan slot, termasuk:

  • Nama partisi harus menyertakan akhiran yang mengidentifikasi partisi 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 menurut abjad sebagai a, b, c, dst. sesuai dengan partisi dengan akhiran _a, _b, _c, dll. Bootloader harus memberi tahu sistem operasi slot mana yang di-booting menggunakan properti command line androidboot.slot_suffix. Properti ini ditetapkan 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 maupun melalui perintah fastboot set_active. Saat memodifikasi partisi yang merupakan bagian dari slot, bootloader akan menghapus "berhasil di-booting" dan mereset jumlah percobaan ulang untuk slot.

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

Alur slotting bootloader
Gambar 1. Alur slotting bootloader
  1. Menentukan 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 sebagai unbootable dan ditandai sebagai slot-successful; slot ini sekarang adalah slot yang dipilih. Jika tidak ada slot yang tersedia, lakukan booting ke pemulihan atau tampilkan pesan error yang bermakna kepada pengguna.

  3. Pilih boot.img yang sesuai dan sertakan jalur untuk memperbaiki partisi sistem pada command line kernel.

  4. Isi parameter slot_suffix command line kernel.

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

Utilitas fastboot menentukan partisi mana yang akan di-flash saat menjalankan perintah flash. Misalnya, menjalankan perintah fastboot flash system system.img pertama-tama membuat kueri 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 set_active fastboot atau perintah setActiveBootSlot HAL kontrol booting, bootloader harus mengupdate 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 non-A/B yang dapat diupdate), pastikan bootloader perangkat memenuhi kriteria berikut.

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

  • Bootloader harus mendukung proses booting secara langsung ke mode pemulihan.

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

    • Bootloader akan berkedip radio. Dalam hal ini, Anda harus dapat memulai ulang dari partisi pemulihan kembali ke bootloader untuk menyelesaikan update.

    • Gambar pemulihan mengedipkan radio.Fungsi ini dapat disediakan sebagai library biner atau utilitas.