Menggunakan daftar simbol

Untuk mengurangi platform simbol dan jenis yang perlu dipertahankan agar stabil, kernel GKI memiliki kemampuan 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.

Menambahkan target untuk pembuatan daftar simbol

Daftar simbol dibuat oleh target kernel_abi. Tambahkan target ini ke BUILD.bazel perangkat 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 In-tree tidak boleh disertakan di sini. Lihat Menyiapkan modul dalam hierarki untuk ekstraksi simbol.

  • kmi_symbol_list_add_only

    Opsi ini mencegah penghapusan simbol yang tidak digunakan. Penghapusan simbol hanya diizinkan pada waktu tertentu selama stabilisasi KMI dan tidak diizinkan setelah KMI dibekukan.

    Hal ini juga berguna jika Anda menggunakan daftar simbol yang sama untuk beberapa perangkat yang berbeda. Dengan cara ini, simbol yang digunakan oleh perangkat A tidak akan dihapus, tetapi perangkat B akan dihapus.

  • module_grouping

    Jika True atau tidak ditentukan, daftar simbol akan mengelompokkan simbol berdasarkan modul kernel yang mereferensikan simbol. Jika tidak, daftar simbol adalah daftar simbol yang diurutkan yang digunakan oleh semua modul kernel.

Lihat common-modules/virtual-device/BUILD.bazel sebagai contoh:

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 pada target kernel_abi di Kleaf.

Menyiapkan modul dalam hierarki untuk ekstraksi simbol

Untuk menyiapkan modul dalam hierarki guna mengekstrak simbol, cantumkan modul dalam hierarki khusus vendor dalam atribut module_outs dari target kernel_build. Lihat _VIRT_COMMON_MODULES dan penggunaannya untuk contoh. Jangan sertakan modul GKI dalam daftar ini.

Konfigurasi modul ini agar tidak ditandatangani. 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 sebagai contoh.

Menambahkan daftar simbol perangkat ke build kernel perangkat

Tambahkan atribut kmi_symbol_list ke target kernel_build yang ditentukan di BUILD.bazel perangkat. 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,
)

Membuat dan mengirimkan 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 build kernel GKI dasar. Misalnya, //common:android/abi_gki_aarch64_virtual_device ditambahkan ke filegroup aarch64_additional_kmi_symbol_lists, yang dideklarasikan di common/BUILD.bazel.

Perbarui daftar simbol perangkat untuk mengisi daftar simbol baru dan mengirimnya ke repositori Android Common Kernel.

Memperbarui daftar simbol perangkat

Semua simbol kernel inti 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 akan 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

Mengirim 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 commit 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 representasi ABI referensi.

Meskipun memperbarui representasi ABI referensi sebelum mengirim pembaruan daftar simbol tidak diperlukan, tindakan ini dapat menghilangkan langkah prapengiriman tambahan dan membuat perubahan siap dikirim lebih cepat. Bagaimanapun, ID ini diperiksa dan diperbarui jika perlu selama pra-pengiriman.

Versi lama (Android 12 dan yang lebih lama)

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 menyertakan build.config.aarch64.

  • KMI_SYMBOL_LIST

    Harus disetel dan diarahkan ke daftar simbol KMI untuk memperbarui.

Setelah memperbarui daftar simbol perangkat, Anda juga perlu mencerminkan perubahan ini dalam build GKI (common/build.config.gki.aarch64):

  • Salin daftar simbol yang diperbarui ke common/android/abi_gki_aarch64_<device>.

  • Pastikan android/abi_gki_aarch64_<device> disertakan dalam ADDITIONAL_KMI_SYMBOL_LISTS di common/build.config.gki.aarch64.

  • Kirim pembaruan daftar simbol ke ACK.