Mengimplementasikan Bootconfig di Android 12

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

Fitur ini menyediakan cara untuk memisahkan parameter konfigurasi untuk Android {i>user-space <i}daripada {i>kernel<i}. Memindahkan kernel androidboot.* yang panjang parameter ke file {i>bootconfig<i} menciptakan ruang pada {i>kernel cmdline<i} dan membuat yang tersedia untuk perluasan di masa depan.

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 12-5.10.xx {i>kernel<i}. 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 dengan format cmdline kernel yang digunakan di Android 11 dan yang lebih lama. Namun, perbedaan berikut penting untuk penggunaan Anda:

  • Parameter harus dipisahkan oleh urutan escape baris baru \n, bukan dengan spasi.

Contoh bootloader

Untuk contoh bootloader, lihat bootloader referensi U-boot Cuttlefish terlepas dari implementasi layanan. Dua commit dalam referensi tercantum di bawah ini. Peningkatan pertama versi {i>booting<i} mendukung ke versi terbaru. Dalam contoh, commit pertama memperbarui (atau mengupdate) dukungan versi ke versi berikutnya, v4. Yang kedua melakukan dua hal; menambahkan penanganan bootconfig, dan menunjukkan penambahan parameter saat runtime:

Contoh build

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

Implementasi

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

Jika Anda memiliki perubahan yang menelusuri file /proc/cmdline untuk parameter androidboot.*, arahkan ke file /proc/bootconfig. ro.boot.* properti disetel dengan nilai bootconfig baru, sehingga Anda tidak perlu membuat perubahan kode dengan 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 BOARD_BOOTCONFIG, seperti {i> kernel cmdline<i} yang dibuat dari BOARD\_KERNEL\_CMDLINE.

Setiap 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 beralih ke kernel. Konfigurasi boot kernel menelusuri bagian bootconfig, dan mencarinya di bagian paling akhir initramfs, dengan trailer yang diharapkan.

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

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 hal berikut:

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

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

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

Parameter yang tidak diketahui pada waktu build hanya diketahui saat runtime di bootloader. Parameter ini harus ditambahkan ke akhir bagian parameter bootconfig sebelum cuplikan {i>bootconfig<i} diterapkan.

Jika Anda perlu menambahkan parameter apa pun setelah cuplikan {i>bootconfig<i} diterapkan, menimpa cuplikan dan menerapkannya kembali.

Implementasi dan validasi inkremental

Mengimplementasikan fitur {i>bootconfig<i} secara bertahap dengan mengikuti proses yang diberikan dalam bagian ini. Biarkan parameter cmdline kernel tidak tersentuh saat parameter bootconfig ditambahkan.

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

  1. Buat bootloader dan build perubahan, lalu lakukan hal berikut:
    1. Menggunakan variabel BOARD_BOOTCONFIG untuk menambahkan bootconfig baru .
    2. Pertahankan parameter cmdline kernel sebagaimana adanya, sehingga perangkat dapat melanjutkan {i>booting<i} dengan benar. Hal ini membuat proses debug dan validasi jauh lebih mudah.
  2. Verifikasi pekerjaan Anda dengan memeriksa konten /proc/bootconfig. Verifikasi Anda melihat parameter yang baru ditambahkan setelah perangkat di-{i>booting<i}.
  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 bahwa parameter tersebut 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 versi {i>kernel<i} lain, Anda harus sangat berhati-hati.

Android 12 adalah versi pertama dengan dukungan bootconfig. Jika melakukan downgrade ke versi apa pun sebelumnya, parameter {i>kernel cmdline<i} harus digunakan sebagai ganti {i>bootconfig<i}.

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

Upgrade dari Android 11 dan yang lebih lama ke Android 12 dan yang lebih baru dapat terus menggunakan parameter cmdline kernel. Hal yang sama berlaku untuk upgrade versi {i>kernel<i}.

Pemecahan masalah

Saat Anda melakukan langkah verifikasi, jika tidak melihat parameter yang diharapkan di /proc/bootconfig, periksa log kernel di logcat. Selalu ada catatan entri yang ada untuk {i>bootconfig<i} jika {i>kernel<i} 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 jenis error yang berbeda, lihat init/main.c.