Cara bekerja dengan daftar simbol

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 memasukkan build.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 dalam ADDITIONAL_KMI_SYMBOL_LISTS di common/build.config.gki.aarch64 .

  • Kirim pembaruan daftar simbol ke ACK .