Di Android 12, fitur bootconfig menggantikan
opsi cmdline kernel androidboot.*
yang digunakan dengan Android 11
dan yang 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 ruang
pengguna Android dari parameter untuk kernel. Memindahkan parameter kernel androidboot.*
yang panjang ke file bootconfig akan menyediakan ruang pada cmdline kernel dan
menyediakannya untuk ekspansi 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
Terapkan fitur bootconfig untuk perangkat baru yang diluncurkan dengan versi kernel 12-5.10.xx. Anda tidak perlu menerapkannya jika meng-upgrade 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 dengan urutan escape baris baru
\n
, bukan dengan spasi.
Contoh bootloader
Untuk contoh bootloader, lihat implementasi bootloader referensi U-boot Cuttlefish. Dua commit dalam referensi tercantum di bawah ini. Yang pertama meningkatkan dukungan versi header booting ke versi terbaru. Dalam contoh ini, update (atau peningkatan) commit pertama yang didukung versi berikutnya, yaitu v4. Yang kedua melakukan dua hal; menambahkan penanganan bootconfig, dan menunjukkan penambahan parameter saat runtime:
Contoh build
Untuk contoh build yang menunjukkan perubahan mkbootimg
guna membangun
vendor_boot.img
dengan header boot vendor v4, lihat mkbootimg changes for
bootconfig
.
Lihat perubahan Cuttlefish untuk melakukan hal berikut:
- Menggunakan (atau meningkatkan) header booting vendor versi v4.
- Tambahkan bootconfig ke cmdline kernel dan pindahkan parameter yang dipilih ke bootconfig.
Penerapan
Partner harus menambahkan dukungan ke bootloadernya, dan memindahkan parameter
androidboot.*
waktu build-nya dari cmdline kernel ke file
bootconfig. Cara terbaik untuk menerapkan perubahan ini adalah melakukannya secara bertahap; lihat bagian
Penerapan dan validasi inkremental
untuk mengetahui informasi tentang mengikuti proses inkremental.
Jika Anda memiliki perubahan yang menelusuri parameter androidboot.*
dalam file /proc/cmdline, arahkan kursor ke file /proc/bootconfig
. Properti ro.boot.*
ditetapkan dengan nilai bootconfig
yang baru, sehingga Anda tidak perlu membuat perubahan pada 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
. Langkah ini membuat {i>kernel<i} mencari
bagian {i>bootconfig<i}:
BOARD_KERNEL_CMDLINE += bootconfig
Parameter bootconfig dibuat dari parameter dalam
variabel BOARD_BOOTCONFIG
, seperti halnya cmdline kernel yang dibuat dari
BOARD\_KERNEL\_CMDLINE
.
Semua parameter androidboot.*
dapat dipindahkan apa adanya, mirip dengan hal berikut:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Perubahan bootloader
Bootloader akan menyiapkan initramfs
sebelum beralih ke kernel. Konfigurasi
boot kernel
menelusuri bagian bootconfig, dan mencarinya berada di akhir
initramfs,
dengan cuplikan yang diharapkan.
Bootloader mendapatkan informasi tata letak vendor_boot.img
dari header image booting
vendor.
Gambar 1. Alokasi memori bootconfig Android 12
Bootloader akan membuat bagian {i>bootconfig<i} di memori. Bagian bootconfig berisi alokasi memori untuk hal berikut:
- Parameter
- Ukuran 4 B
parameters size
- Ukuran 4 B
parameters checksum
- 12 B string ajaib bootconfig (
#BOOTCONFIG\n
)
Parameter ini 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 image vendor_boot
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 bootconfig diterapkan.
Jika Anda perlu menambahkan parameter apa pun setelah cuplikan bootconfig diterapkan, timpa cuplikan tersebut dan terapkan kembali.
Implementasi dan validasi inkremental
Implementasikan fitur bootconfig secara bertahap dengan mengikuti proses yang diberikan di bagian ini. Jangan ubah parameter cmdline kernel saat parameter bootconfig ditambahkan.
Berikut adalah langkah-langkah untuk implementasi inkremental, 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. Hal ini mempermudah proses debug dan validasi.
- Gunakan variabel
- Verifikasi pekerjaan Anda dengan memeriksa konten
/proc/bootconfig
. Pastikan Anda melihat parameter yang baru ditambahkan setelah perangkat di-booting. - Pindahkan parameter
androidboot.*
dari cmdline kernel ke bootconfig, menggunakan variabelBOARD_BOOTCONFIG
dan bootloader. - Verifikasi bahwa setiap parameter ada di
/proc/bootconfig
DAN bahwa parameter tersebut tidak di/proc/cmdline
. Jika Anda dapat memverifikasi hal ini, penerapan Anda berhasil.
Pertimbangan upgrade dan downgrade OTA
Saat mengelola upgrade dan downgrade OTA antara versi Android yang berbeda, atau versi kernel yang berbeda, Anda harus sangat berhati-hati.
Android 12 adalah versi pertama dengan dukungan bootconfig. Jika Anda melakukan downgrade ke versi apa pun sebelum tanggal tersebut, parameter cmdline kernel harus digunakan, bukan bootconfig.
Kernel versi 12-5.4 dan yang lebih baru mendukung bootconfig. Jika mendowngrade ke versi apa pun sebelumnya(termasuk 11-5.4), parameter kernel cmdline harus digunakan.
Upgrade dari Android 11 dan yang lebih lama ke Android 12 dan yang lebih baru dapat terus menggunakan parameter kernel cmdline. Hal yang sama berlaku untuk upgrade versi {i>kernel<i}.
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.