Menerapkan 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 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:

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.

Diagram of bootconfig memory allocation layout

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:

  1. Buat perubahan bootloader dan build, lalu lakukan hal berikut:
    1. Gunakan variabel BOARD_BOOTCONFIG untuk menambahkan parameter bootconfig baru.
    2. Pertahankan parameter cmdline kernel sebagaimana adanya, sehingga perangkat dapat terus melakukan booting dengan benar. Ini membuat proses debug dan validasi menjadi lebih mudah.
  2. Verifikasi pekerjaan Anda dengan memeriksa konten /proc/bootconfig . Pastikan Anda melihat parameter yang baru ditambahkan setelah perangkat melakukan booting.
  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 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 .