Menggunakan daftar simbol

Untuk mengurangi permukaan simbol dan jenis yang perlu dijaga agar tetap stabil, {i>kernel<i} GKI memiliki kemampuan untuk membatasi simbol yang diekspor hanya untuk simbol yang yang dibutuhkan oleh modul. Untuk modul yang dikompilasi secara eksternal, Anda harus memiliki daftar simbol yang digunakan agar bisa diekspor oleh {i>kernel<i} GKI. Misalnya, simbol yang digunakan oleh modul untuk Sittlefish disimpan inci android/abi_gki_aarch64_virtual_device

Menambahkan target untuk pembuatan daftar simbol

Daftar simbol dibuat 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 perangkat target kernel_build.

Anda juga dapat menggunakan opsi berikut:

  • kernel_modules

    Daftar target untuk modul out-of-tree. Modul In-tree tidak boleh disertakan di sini. Rujuk ke 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 KMI stabilisasi dan tidak diizinkan setelah KMI dibekukan.

    Ini juga berguna bila Anda menggunakan daftar simbol yang sama untuk beberapa perangkat. Dengan cara ini, {i>tool<i} ini tidak akan menghapus simbol yang digunakan oleh perangkat A, tetapi tidak perangkat B.

  • module_grouping

    Jika True atau tidak ditentukan, simbol akan mengelompokkan simbol berdasarkan modul {i>kernel<i} yang mereferensikan simbol tersebut. Jika tidak, daftar simbol itu merupakan daftar simbol yang diurutkan yang digunakan oleh semua modul {i>kernel<i}.

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

Menyiapkan modul dalam hierarki untuk ekstraksi simbol

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

Konfigurasikan modul-modul ini agar tidak bertanda tangan, jika tidak daftar simbol mungkin kosong. Untuk melakukannya, tambahkan baris ini ke {i>kernel<i} Anda config fragment:

# CONFIG_MODULE_SIG_ALL is not set

Lihat common-modules/virtual-device/virtual_device_core.fragment ke titik akhir pelanggan.

Menambahkan 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,
)

Membuat dan mengirimkan daftar simbol awal

Buat daftar simbol kosong di common/android/abi_gki_<arch>_<device>. Untuk contoh di atas perintah tersebut adalah:

touch common/android/abi_gki_aarch64_virtual_device

Tambahkan file ini ke additional_kmi_symbol_lists build kernel GKI dasar. Sebagai contoh, //common:android/abi_gki_aarch64_virtual_device ditambahkan ke Grup file aarch64_additional_kmi_symbol_lists, dideklarasikan di common/BUILD.bazel.

Perbarui daftar simbol perangkat untuk mengisi daftar simbol baru dan kirimkan ke repositori Kernel Umum Android.

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 dimasukkan dalam daftar simbol. Hal ini dapat dilakukan dengan menjalankan target kernel_abi dengan _update_symbol_list akhiran. 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

Mengirim pembaruan daftar simbol ke ACK

Kirim patch dengan perubahan daftar simbol ke Android Umum {i>Kernel<i} gerrit untuk membuat simbol-simbol baru menjadi 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 $DIST_DIR/abi.report.short laporan setelahnya memperbarui ABI referensi representasi visual.

Saat mengupdate ABI referensi representasi sebelum mengirim pembaruan daftar simbol tidak diperlukan, maka mungkin akan menghilangkan langkah pra-pengiriman dan membuat perubahan siap dikirim dengan lebih cepat. Bagaimanapun, itu 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 merupakan 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 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 dalam common/build.config.gki.aarch64.

  • Kirim pembaruan daftar simbol ke ACK.