Mengimplementasikan bootconfig di Android 12

Di Android 12, fitur bootconfig menggantikan opsi cmdline kernel androidboot.* yang digunakan dengan Android 11 dan yang lebih lama. Fitur bootconfig adalah mekanisme untuk meneruskan detail konfigurasi dari build dan bootloader ke Android 12.

Fitur ini menyediakan cara untuk memisahkan parameter konfigurasi untuk ruang pengguna Android dari parameter konfigurasi untuk kernel. Memindahkan parameter kernel androidboot.* yang panjang ke file bootconfig akan menyediakan ruang di cmdline kernel dan membuatnya tersedia untuk perluasan pada masa mendatang.

Kernel dan ruang pengguna Android harus mendukung bootconfig.

  • Rilis pertama yang memiliki dukungan ini: Android 12
  • Versi kernel pertama yang memiliki dukungan ini: kernel 12-5.4.xx

Menerapkan fitur bootconfig untuk perangkat baru yang diluncurkan dengan versi kernel 12-5.10.xx. Anda tidak perlu menerapkannya jika mengupgrade perangkat.

Contoh dan sumber

Saat Anda melihat contoh dan kode sumber di bagian ini, perhatikan bahwa format kode bootconfig hanya sedikit berbeda dari format cmdline kernel yang digunakan di Android 11 dan yang lebih rendah. Namun, perbedaan berikut penting untuk penggunaan Anda:

  • Parameter harus dipisahkan dengan urutan escape newline \n, bukan dengan spasi.

Contoh bootloader

Untuk contoh bootloader, lihat penerapan bootloader referensi U-boot Cuttlefish. Dua commit dalam referensi tercantum di bawah. Uprev pertama mendukung versi header booting ke versi terbaru. Dalam contoh, commit pertama memperbarui (atau meng-upgrade) dukungan versi ke versi berikutnya, v4. Yang kedua melakukan dua hal; menambahkan penanganan bootconfig, dan menunjukkan cara menambahkan parameter saat runtime:

Membangun contoh

Untuk contoh build yang menunjukkan perubahan mkbootimg untuk membangun vendor_boot.img dengan header boot vendor v4, lihat mkbootimg changes for bootconfig. Lihat perubahan Cuttlefish untuk melakukan hal berikut:

Implementasi

Partner harus menambahkan dukungan ke bootloader mereka, dan memindahkan parameter androidboot.* waktu build dari cmdline kernel ke file bootconfig. Cara terbaik untuk menerapkan perubahan ini adalah dengan melakukannya secara bertahap; lihat bagian Penerapan dan validasi bertahap untuk mengetahui informasi tentang cara mengikuti proses bertahap.

Jika Anda memiliki perubahan yang menelusuri file /proc/cmdline untuk parameter androidboot.*, arahkan perubahan tersebut ke file /proc/bootconfig. Properti ro.boot.* ditetapkan dengan nilai bootconfig baru, sehingga Anda tidak perlu melakukan perubahan untuk kode yang menggunakan properti tersebut.

Perubahan build

Pertama, tingkatkan versi header booting Anda ke versi 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Tambahkan parameter cmdline kernel bootconfig. Tindakan ini akan membuat kernel mencari bagian bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Parameter bootconfig dibuat dari parameter dalam variabel BOARD_BOOTCONFIG, seperti halnya cmdline kernel dibuat dari BOARD\_KERNEL\_CMDLINE.

Parameter androidboot.* dapat dipindahkan apa adanya, mirip dengan berikut ini:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Perubahan bootloader

Bootloader menyiapkan initramfs sebelum melompat ke kernel. Konfigurasi booting kernel mencari bagian bootconfig, dan memastikan bagian tersebut berada di paling akhir initramfs, dengan trailer yang diharapkan.

Bootloader mendapatkan informasi tata letak vendor_boot.img dari header image boot vendor.

Diagram tata letak alokasi memori bootconfig

Gambar 1. Alokasi memori bootconfig Android 12

Bootloader membuat bagian bootconfig dalam memori. Bagian bootconfig berisi alokasi memori untuk berikut ini:

  • Parameter
  • Ukuran 4 B parameters size
  • Ukuran 4 B parameters checksum
  • 12 B string ajaib bootconfig (#BOOTCONFIG\n)

Parameter berasal dari dua sumber: Parameter yang diketahui pada waktu build, dan parameter yang tidak diketahui pada waktu build. Parameter yang tidak diketahui harus ditambahkan.

Parameter yang diketahui pada waktu build dikemas ke akhir gambar vendor_boot di bagian bootconfig. Ukuran bagian disimpan (sebagai byte) di kolom header boot vendor vendor_bootconfig_size.

Parameter yang tidak diketahui pada waktu build hanya diketahui pada waktu runtime di bootloader. Parameter ini harus ditambahkan ke bagian akhir parameter bootconfig sebelum trailer bootconfig diterapkan.

Jika Anda perlu menambahkan parameter apa pun setelah trailer bootconfig diterapkan, ganti trailer dan terapkan kembali.

Penerapan dan validasi inkremental

Terapkan fitur bootconfig secara bertahap dengan mengikuti proses yang diberikan di bagian ini. Biarkan parameter cmdline kernel tidak berubah saat parameter bootconfig ditambahkan.

Berikut adalah langkah-langkah untuk penerapan inkremental, dengan validasi:

  1. Buat perubahan bootloader dan build, lalu lakukan hal berikut:
    1. Gunakan variabel BOARD_BOOTCONFIG untuk menambahkan parameter bootconfig baru.
    2. Biarkan parameter cmdline kernel seperti apa adanya, sehingga perangkat dapat terus melakukan booting dengan benar. Hal ini membuat proses pen-debug-an dan validasi menjadi jauh lebih mudah.
  2. Verifikasi tugas Anda dengan memeriksa isi /proc/bootconfig. Verifikasi bahwa Anda melihat parameter yang baru ditambahkan setelah perangkat di-boot.
  3. Pindahkan parameter androidboot.* dari cmdline kernel ke bootconfig, menggunakan variabel BOARD_BOOTCONFIG dan bootloader.
  4. Verifikasi bahwa setiap parameter ada di /proc/bootconfig DAN tidak ada di /proc/cmdline. Jika Anda dapat memverifikasinya, penerapan Anda berhasil.

Pertimbangan upgrade dan downgrade OTA

Saat Anda mengelola upgrade dan downgrade OTA antara berbagai versi Android, atau berbagai versi kernel, Anda harus berhati-hati.

Android 12 adalah versi pertama yang memiliki dukungan bootconfig. Jika melakukan downgrade ke versi sebelum itu, parameter cmdline kernel harus digunakan, bukan bootconfig.

Kernel versi 12-5.4 dan yang lebih baru mendukung bootconfig. Jika melakukan downgrade ke versi apa pun sebelum itu(termasuk 11-5.4), parameter cmdline kernel harus digunakan.

Upgrade dari Android 11 dan yang lebih rendah ke Android 12 dan yang lebih tinggi dapat terus menggunakan parameter cmdline kernel. Hal yang sama berlaku untuk mengupgrade versi kernel.

Pemecahan masalah

Saat Anda melakukan langkah verifikasi, jika Anda tidak melihat parameter yang diharapkan di /proc/bootconfig, periksa log kernel di logcat. Selalu ada entri log untuk bootconfig jika kernel mendukungnya.

Contoh output log

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

Jika Anda melihat log error yang ditampilkan, berarti ada masalah saat memuat bootconfig. Untuk melihat berbagai jenis error, lihat init/main.c.