Menerapkan Bootconfig di Android 12

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 yang untuk kernel. Memindahkan parameter kernel androidboot.* yang panjang ke file bootconfig akan menciptakan ruang pada cmdline kernel dan membuatnya tersedia untuk perluasan yang mudah 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 peluncuran perangkat baru 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 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 implementasi bootloader referensi U-boot Cuttlefish. Dua komit 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 yang 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.* build-time mereka dari cmdline kernel ke file bootconfig. Cara terbaik untuk menerapkan perubahan ini adalah melakukannya secara bertahap; lihat bagian Implementasi dan validasi Inkremental untuk informasi tentang mengikuti proses inkremental.

Jika Anda memiliki perubahan yang mencari file /proc/cmdline untuk parameter androidboot.* , arahkan ke file /proc/bootconfig sebagai gantinya. Properti ro.boot.* disetel dengan nilai bootconfig baru, jadi Anda tidak perlu membuat perubahan untuk 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 , sama seperti cmdline kernel dibuat dari BOARD\_KERNEL\_CMDLINE .

androidboot.* apa pun 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 melompat ke kernel. Konfigurasi boot kernel mencari bagian bootconfig, dan mencarinya di akhir initramfs, dengan cuplikan yang diharapkan.

Bootloader mendapatkan informasi tata letak vendor_boot.img dari header image 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-hal berikut:

  • Parameter
  • 4 ukuran parameters size B
  • 4 parameters checksum
  • 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 bagian akhir gambar vendor_boot di bagian bootconfig. Ukuran bagian disimpan (sebagai byte) di bidang header boot vendor vendor_bootconfig_size .

Parameter yang tidak diketahui saat build hanya diketahui saat runtime di bootloader. Ini harus ditambahkan ke akhir bagian parameter bootconfig sebelum trailer bootconfig diterapkan.

Jika Anda perlu menambahkan parameter apa pun setelah trailer bootconfig diterapkan, timpa trailer dan terapkan kembali.

Implementasi dan validasi tambahan

Terapkan 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 inkremental, dengan validasi:

  1. Lakukan 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 debugging dan validasi menjadi lebih mudah.
  2. Verifikasi pekerjaan Anda dengan memeriksa isi /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, implementasi 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 apa pun sebelum itu, parameter cmdline kernel harus digunakan sebagai ganti 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.

Upgrade 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 memutakhirkan 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, maka ada masalah saat memuat bootconfig. Untuk melihat jenis kesalahan yang berbeda, lihat init/main.c .