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 ruang pengguna Android dari parameter konfigurasi kernel. Memindahkan parameter kernel androidboot.*
yang panjang ke file bootconfig akan menciptakan ruang pada cmdline kernel dan membuatnya tersedia untuk kemudahan ekspansi di 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
Terapkan fitur bootconfig untuk perangkat baru yang diluncurkan dengan versi kernel 12-5.10.xx. Anda tidak perlu menerapkannya jika Anda 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 lebih rendah. Namun, perbedaan berikut ini penting untuk penggunaan Anda:
- Parameter harus dipisahkan dengan escape sequence baris baru
\n
, bukan dengan spasi.
Contoh Bootloader
Untuk contoh bootloader, lihat implementasi bootloader referensi Cuttlefish U-boot. Dua komitmen dalam referensi tercantum di bawah ini. Yang pertama meningkatkan dukungan versi header boot ke versi terbaru. Dalam contoh, komit pertama memperbarui (atau meningkatkan) dukungan versi ke versi berikutnya, v4. Yang kedua melakukan dua hal; itu menambahkan penanganan bootconfig, dan menunjukkan penambahan parameter saat runtime:
Membangun Contoh
Untuk contoh build yang menunjukkan perubahan mkbootimg
untuk membangun vendor_boot.img
dengan vendor boot header v4, lihat mkbootimg changes for bootconfig
. Lihat perubahan Sotong untuk melakukan hal berikut:
- Gunakan (atau tingkatkan) versi header boot vendor v4 .
- Tambahkan
bootconfig to the kernel cmdline and move selected parameters to bootconfig
.
Penerapan
Mitra harus menambahkan dukungan ke bootloader mereka, dan memindahkan parameter androidboot.*
waktu build mereka dari cmdline kernel ke file bootconfig. Cara terbaik untuk menerapkan perubahan ini adalah dengan melakukannya secara bertahap; lihat bagian Implementasi dan validasi tambahan untuk informasi tentang cara mengikuti proses tambahan.
Jika Anda memiliki perubahan yang mencari parameter androidboot.*
di file /proc/cmdline, arahkan perubahan tersebut ke file /proc/bootconfig. Properti ro.boot.*
disetel dengan nilai bootconfig
baru, jadi Anda tidak perlu membuat perubahan kode menggunakan properti tersebut.
Membangun Perubahan
Pertama, tingkatkan versi header boot Anda ke versi 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Tambahkan parameter cmdline kernel bootconfig
. Ini membuat kernel mencari bagian bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
Parameter bootconfig dibuat dari parameter dalam variabel BOARD_BOOTCONFIG
, seperti cmdline kernel yang dibuat dari BOARD\_KERNEL\_CMDLINE
.
Parameter androidboot.*
apa pun dapat dipindahkan apa adanya, serupa dengan yang berikut:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Perubahan Bootloader
Bootloader menyiapkan initramfs
sebelum melompat ke kernel. Konfigurasi boot kernel mencari bagian bootconfig, dan mencarinya di akhir initramfs,
dengan trailer yang diharapkan.
Bootloader mendapatkan informasi tata letak vendor_boot.img
dari header gambar boot vendor.
Gambar 1. Alokasi memori bootconfig Android 12
Bootloader membuat bagian bootconfig di memori. Bagian bootconfig berisi alokasi memori untuk hal berikut:
- Parameter
- 4 ukuran
parameters size
B -
parameters checksum
ukuran 4 B - 12 B string ajaib bootconfig (
#BOOTCONFIG\n
)
Parameter berasal dari dua sumber: Parameter yang diketahui pada waktu pembuatan, dan parameter yang tidak diketahui pada waktu pembuatan. Parameter yang tidak diketahui harus ditambahkan.
Parameter yang diketahui pada waktu pembuatan dikemas ke akhir gambar vendor_boot
di bagian bootconfig. Ukuran bagian disimpan (sebagai byte) di bidang header boot vendor vendor_bootconfig_size
.
Parameter yang tidak diketahui pada waktu build hanya diketahui pada saat runtime di bootloader. Ini harus ditambahkan ke akhir bagian parameter bootconfig sebelum trailer bootconfig diterapkan.
Jika Anda perlu menambahkan parameter apa pun setelah cuplikan bootconfig diterapkan, timpa cuplikan tersebut dan terapkan kembali.
Implementasi dan validasi tambahan
Implementasikan fitur bootconfig secara bertahap dengan mengikuti proses yang diberikan di bagian ini. Biarkan parameter cmdline kernel tidak tersentuh saat parameter bootconfig ditambahkan.
Ini adalah langkah-langkah untuk implementasi tambahan, dengan validasi:
- Buat perubahan bootloader dan build, lalu lakukan hal berikut:
- Gunakan variabel
BOARD_BOOTCONFIG
untuk menambahkan parameter bootconfig baru. - Pertahankan parameter cmdline kernel sebagaimana adanya, sehingga perangkat dapat terus melakukan booting dengan benar. Ini membuat proses debug dan validasi menjadi lebih mudah.
- Gunakan variabel
- Verifikasi pekerjaan Anda dengan memeriksa konten
/proc/bootconfig
. Pastikan Anda melihat parameter yang baru ditambahkan setelah perangkat melakukan booting. - Pindahkan parameter
androidboot.*
dari cmdline kernel ke bootconfig, menggunakan variabelBOARD_BOOTCONFIG
dan bootloader. - Verifikasi bahwa setiap parameter ada di
/proc/bootconfig
DAN tidak ada di/proc/cmdline
. Jika Anda dapat memverifikasi ini, penerapan Anda berhasil.
Pertimbangan peningkatan dan penurunan versi OTA
Saat Anda mengelola peningkatan dan penurunan versi OTA antara versi Android yang berbeda, atau versi kernel yang berbeda, perhatian khusus harus diberikan.
Android 12 adalah versi pertama dengan dukungan bootconfig. Jika menurunkan versi ke versi sebelumnya, parameter cmdline kernel harus digunakan alih-alih bootconfig.
Kernel versi 12-5.4 dan yang lebih baru mendukung bootconfig. Jika menurunkan versi ke versi sebelumnya (termasuk 11-5.4), parameter cmdline kernel harus digunakan.
Peningkatan dari Android 11 dan yang lebih lama ke Android 12 dan yang lebih baru dapat tetap menggunakan parameter cmdline kernel. Hal yang sama berlaku untuk mengupgrade versi kernel.
Penyelesaian 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 keluaran log
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Jika Anda melihat log kesalahan kembali, berarti ada masalah saat memuat bootconfig. Untuk melihat jenis kesalahan yang berbeda, lihat init/main.c .