Untuk mengurangi permukaan simbol dan tipe yang perlu dijaga agar tetap stabil, kernel GKI memiliki fungsi untuk membatasi simbol yang diekspor hanya pada simbol yang diperlukan oleh modul. Untuk modul yang dikompilasi secara eksternal, Anda harus memiliki daftar simbol yang digunakan agar dapat diekspor oleh kernel GKI. Misalnya, simbol yang digunakan oleh modul untuk Cuttlefish disimpan di android/abi_gki_aarch64_virtual_device
.
Tambahkan target untuk pembuatan daftar simbol
Daftar simbol dihasilkan oleh target kernel_abi
. Tambahkan target ini ke perangkat BUILD.bazel
dengan opsi berikut:
name
Harus dalam format
<kernel_build>_abi
.kernel_build
Harus berisi nama target
kernel_build
perangkat.
Anda juga dapat menggunakan opsi berikut:
kernel_modules
Daftar target untuk modul out-of-tree . Modul dalam pohon tidak boleh disertakan di sini. Lihat Mempersiapkan modul dalam pohon untuk ekstraksi simbol .
kmi_symbol_list_add_only
Opsi ini mencegah penghapusan simbol yang tidak digunakan. Penghapusan simbol hanya diperbolehkan pada waktu tertentu selama stabilisasi KMI dan tidak diperbolehkan setelah KMI dibekukan .
Ini juga berguna ketika Anda menggunakan daftar simbol yang sama untuk beberapa perangkat berbeda. Dengan cara ini ia tidak akan menghapus simbol yang digunakan oleh perangkat A tetapi tidak digunakan oleh perangkat B.
module_grouping
Jika
True
atau tidak ditentukan, maka daftar simbol akan mengelompokkan simbol berdasarkan modul kernel yang mereferensikan simbol tersebut. Jika tidak, daftar simbol hanya akan menjadi daftar simbol yang diurutkan yang digunakan oleh semua modul kernel.
Lihat common-modules/virtual-device/BUILD.bazel misalnya:
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [
":virtual_device_aarch64_external_modules",
],
kmi_symbol_list_add_only = True,
)
Lihat juga dokumentasi referensi tentang target kernel_abi
di Kleaf.
Siapkan modul in-tree untuk ekstraksi simbol
Untuk mempersiapkan modul in-tree untuk ekstraksi simbol, daftarkan modul in-tree khusus vendor di atribut module_outs
dari target kernel_build
. Lihat _VIRT_COMMON_MODULES
dan penggunaannya sebagai contoh. Jangan sertakan modul GKI dalam daftar ini.
Konfigurasikan modul ini menjadi unsigned , jika tidak, daftar simbol mungkin kosong. Untuk melakukannya, tambahkan baris ini ke fragmen konfigurasi kernel Anda:
# CONFIG_MODULE_SIG_ALL is not set
Lihat common-modules/virtual-device/virtual_device_core.fragment misalnya.
Tambahkan daftar simbol perangkat ke build kernel perangkat
Tambahkan atribut kmi_symbol_list
ke target kernel_build
yang ditentukan di perangkat BUILD.bazel
. Nama daftar simbol harus dalam format //common:android/abi_gki_<arch>_<device>
. Lihat common-modules/virtual-device/BUILD.bazel , misalnya:
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
Buat dan kirimkan daftar simbol awal
Buat daftar simbol kosong di common/android/abi_gki_<arch>_<device>
. Untuk contoh di atas, perintahnya adalah:
touch common/android/abi_gki_aarch64_virtual_device
Tambahkan file ini ke additional_kmi_symbol_lists
dari build kernel GKI dasar. Misalnya, //common:android/abi_gki_aarch64_virtual_device
ditambahkan ke grup file aarch64_additional_kmi_symbol_lists
, yang dideklarasikan dalam common/BUILD.bazel .
Perbarui daftar simbol perangkat untuk mengisi daftar simbol baru dan mengirimkannya ke repositori Android Common Kernel.
Perbarui daftar simbol perangkat
Semua simbol inti kernel yang digunakan oleh modul di module_outs
dari kernel_build
dan kernel_modules
dari kernel_abi
harus disertakan dalam daftar simbol. Hal ini dapat dilakukan dengan menjalankan target kernel_abi
dengan akhiran _update_symbol_list
. Misalnya, perintah berikut memperbarui daftar simbol untuk //common-modules/virtual-device:virtual_device_aarch64
:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list
Kirim pembaruan daftar simbol ke ACK
Kirim patch dengan perubahan daftar simbol ke gerrit Android Common Kernel untuk menjadikan simbol baru sebagai bagian dari KMI.
Pesan komit harus menyertakan daftar simbol yang ditambahkan atau dihapus. Anda dapat menulis daftar ini secara manual untuk pembaruan daftar simbol kecil atau menggunakan laporan $DIST_DIR/abi.report.short
setelah memperbarui referensi representasi ABI .
Meskipun memperbarui representasi ABI referensi sebelum mengirim pembaruan daftar simbol tidak diperlukan, hal ini dapat menghilangkan langkah-langkah pra-pengiriman tambahan dan membuat perubahan siap dikirim lebih cepat. Bagaimanapun, ini akan diperiksa dan diperbarui jika perlu selama prapengiriman.
Versi yang lebih lama (Android 12 dan lebih rendah)
Gunakan alat build_abi.sh
sebagai berikut:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list
Dalam contoh ini, build.config.device
harus menyertakan opsi konfigurasi berikut:
vmlinux
Harus menjadi bagian dari daftar
FILES
. Hal ini dapat dilakukan dengan memasukkanbuild.config.aarch64
.KMI_SYMBOL_LIST
Harus diatur dan diarahkan ke daftar simbol KMI untuk diperbarui.
Setelah memperbarui daftar simbol perangkat, Anda juga perlu mencerminkan perubahan ini di build GKI ( common/build.config.gki.aarch64
):
Salin daftar simbol yang diperbarui ke
common/android/abi_gki_aarch64_<device>
.Periksa apakah
android/abi_gki_aarch64_<device>
disertakan dalamADDITIONAL_KMI_SYMBOL_LISTS
dicommon/build.config.gki.aarch64
.