Di Android 12, fitur bootconfig menggantikan
Opsi cmdline kernel androidboot.*
yang digunakan dengan Android 11
dan lebih rendah. Fitur {i>bootconfig<i} adalah mekanisme
untuk meneruskan konfigurasi
detail dari build dan bootloader hingga 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 meng-upgrade perangkat.
Contoh dan sumber
Saat Anda melihat contoh dan kode sumber di bagian ini, perhatikan bahwa format
dari kode bootconfig
hanya sedikit berbeda dari format
{i>kernel cmdline<i} yang digunakan di Android 11 dan yang lebih rendah.
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, yang pertama melakukan pembaruan (atau meningkatkan) dukungan versi ke versi berikutnya, v4. Yang kedua melakukan dua hal; model ini menambahkan penanganan {i>bootconfig<i}, dan menunjukkan penambahan parameter pada runtime:
Contoh build
Untuk contoh build yang menunjukkan perubahan mkbootimg
untuk membangun
vendor_boot.img
dengan header booting vendor v4, lihat mkbootimg changes for
bootconfig
.
Lihat perubahan Cuttlefish untuk melakukan hal berikut:
- Menggunakan (atau meningkatkan) versi header booting vendor v4.
- Tambahkan bootconfig ke cmdline kernel dan pindahkan parameter yang dipilih ke bootconfig.
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 dengan melakukannya secara bertahap; lihat
Bagian Penerapan dan validasi inkremental
untuk informasi tentang mengikuti suatu proses inkremental.
Jika ada perubahan yang menelusuri androidboot.*
di file /proc/cmdline
parameter, arahkan mereka ke file /proc/bootconfig
. ro.boot.*
properti disetel dengan nilai bootconfig
baru, jadi 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
. Hal ini membuat {i>
kernel<i} mencari
bagian bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
Parameter bootconfig dibuat dari parameter dalam
BOARD_BOOTCONFIG
, sama seperti kernel cmdline, 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. Kernel
konfigurasi booting
mencari bagian {i>bootconfig<i}, dan
mencarinya di akhir
initramfs,
dengan cuplikan yang diharapkan.
Bootloader mendapatkan informasi tata letak vendor_boot.img
dari vendor
header image booting.
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 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 pada runtime dalam {i>bootloader<i}. 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. Jangan ubah parameter cmdline kernel, parameter {i>bootconfig<i} ditambahkan.
Berikut adalah langkah-langkah untuk implementasi inkremental, dengan validasi:
- Buat bootloader dan build perubahan, lalu lakukan hal berikut:
- Menggunakan variabel
BOARD_BOOTCONFIG
untuk menambahkan bootconfig baru . - Pertahankan parameter cmdline kernel sebagaimana adanya, sehingga perangkat dapat melanjutkan {i>booting<i} dengan benar. Hal ini menjadikan proses debug dan validasi sangat semuanya.
- Menggunakan variabel
- Verifikasi pekerjaan Anda dengan memeriksa konten
/proc/bootconfig
. Verifikasi Anda melihat parameter yang baru ditambahkan setelah perangkat di-{i>booting<i}. - Pindahkan parameter
androidboot.*
dari cmdline kernel ke bootconfig, menggunakan variabelBOARD_BOOTCONFIG
dan bootloader. - Verifikasi bahwa setiap parameter ada di
/proc/bootconfig
DAN yang mereka tidak berada di/proc/cmdline
. Jika Anda dapat memverifikasinya, implementasi 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 bootconfig dukungan teknis IT. 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 mendowngrade ke versi sebelumnya(termasuk 11-5.4), parameter {i> kernel cmdline<i} harus data
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 melakukan langkah verifikasi, jika Anda 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 {i>bootconfig<i}. Untuk melihat jenis error yang berbeda, lihat init/main.c.