Sembol listeleriyle çalışma

Sabit kalması gereken simge ve türlerin yüzeyini azaltmak için GKI çekirdeği, dışa aktarılan simgeleri yalnızca modüllerin ihtiyaç duyduğu simgelerle sınırlama özelliklerine sahiptir. Harici olarak derlenmiş modüllerin GKI çekirdeği tarafından dışa aktarılmasına izin vermek için kullanılan sembollerin bir listesine sahip olmanız gerekir. Örneğin, modüller tarafından Cuttlefish için kullanılan simgeler android/abi_gki_aarch64_virtual_device içinde depolanır.

Simge listesi oluşturma işlemi için hedef ekleme

Simge listeleri kernel_abi hedefi tarafından oluşturulur. Aşağıdaki seçeneklerle bu hedefi BUILD.bazel cihazına ekleyin:

  • name

    <kernel_build>_abi biçiminde olmalıdır.

  • kernel_build

    Cihaz kernel_build hedefinin adını içermelidir.

Aşağıdaki seçenekleri de kullanabilirsiniz:

  • kernel_modules

    Ağa bağlı olmayan modüllerin hedeflerinin listesi. Ağaç içi modüller buraya dahil edilmemelidir. Ağa yerleştirilmiş modülleri sembol ayıklama için hazırlama başlıklı makaleyi inceleyin.

  • kmi_symbol_list_add_only

    Bu seçenek, kullanılmayan simgelerin kaldırılmasını engeller. Sembol kaldırmaya yalnızca KMI stabilizasyonu sırasında belirli zamanlarda izin verilir ve KMI soğuduktan sonra izin verilmez.

    Bu, aynı simge listesini birden fazla farklı cihaz için kullandığınızda da faydalıdır. Bu sayede, A cihazı tarafından kullanılan ancak B cihazı tarafından kullanılmayan semboller kaldırılmaz.

  • module_grouping

    True ise veya belirtilmezse simge listesi, simgelere referans veren çekirdek modüllerine göre simgeleri gruplandırır. Aksi takdirde, simge listesi tüm çekirdek modülleri tarafından kullanılan simgelerin sıralanmış bir listesidir.

common-modules/virtual-device/BUILD.bazel sayfasını inceleyin. Örneğin:

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

Kleaf'teki kernel_abi hedefiyle ilgili referans belgelerine de bakın.

Ağdaki modülleri simge ayıklama için hazırlama

Ağ içi modülleri sembol ayıklama için hazırlamak üzere tedarikçi firmaya özgü ağ içi modülleri kernel_build hedefinin module_outs özelliğinde listeleyin. Örnek olarak _VIRT_COMMON_MODULES ve kullanımına bakın. Bu listeye GKI modüllerini eklemeyin.

Bu modülleri imzasız olacak şekilde yapılandırın. Aksi takdirde simge listesi boş olabilir. Bunu yapmak için çekirdek yapılandırma parçalarınıza şu satırı ekleyin:

# CONFIG_MODULE_SIG_ALL is not set

Örneğin, common-modules/virtual-device/virtual_device_core.fragment dosyasını inceleyin.

Cihaz çekirdek derlemesine cihaz sembol listesi ekleme

kmi_symbol_list özelliğini, BUILD.bazel cihazında tanımlanan kernel_build hedefine ekleyin. Simge listesinin adı //common:android/abi_gki_<arch>_<device> biçiminde olmalıdır. Örneğin, common-modules/virtual-device/BUILD.bazel dosyasına bakın:

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

İlk simge listesi oluşturma ve gönderme

common/android/abi_gki_<arch>_<device> konumunda boş bir simge listesi oluşturun. Yukarıdaki örnekte komut şu şekilde olur:

touch common/android/abi_gki_aarch64_virtual_device

Bu dosyayı, temel GKI çekirdek derlemesinin additional_kmi_symbol_lists bölümüne ekleyin. Örneğin, //common:android/abi_gki_aarch64_virtual_device, common/BUILD.bazel dosya grubunda tanımlanan aarch64_additional_kmi_symbol_lists dosya grubuna eklenir.

Yeni simge listesini doldurmak ve Android Ortak Çekirdek deposuna göndermek için cihaz simge listesini güncelleyin.

Cihaz simgesi listesini güncelleme

kernel_build'un module_outs bölümündeki ve kernel_abi'ın kernel_modules bölümündeki modüller tarafından kullanılan tüm temel çekirdek sembolleri simge listesine dahil edilmelidir. Bu işlem, kernel_abi hedefini _update_symbol_list son ekiyle çalıştırarak yapılabilir. Örneğin, aşağıdaki komut //common-modules/virtual-device:virtual_device_aarch64 için simge listesini günceller:

tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list

ACK'ye bir simge listesi güncellemesi gönderme

Yeni simgeleri KMI'nin bir parçası haline getirmek için, sembol listesinin değiştirildiğini Android Ortak Çekirdeği'ne içeren bir yama gönderin.

Kaydetme mesajı, eklenen veya kaldırılan sembollerin listesini içermelidir. Küçük bir simge listesi güncellemesi için bu listeyi manuel olarak yazabilir veya referans ABI temsilini güncelledikten sonra $DIST_DIR/abi.report.short raporunu kullanabilirsiniz.

Bir simge listesi güncellemesi göndermeden önce referans ABI temsilini güncellemek gerekli olmasa da bu işlem, ek göndermeden önce adımlardan kurtulmanıza ve değişikliği daha hızlı göndermeye hazır hale getirmenize yardımcı olabilir. Her durumda, göndermeden önce kontrol edilir ve gerekirse güncellenir.

Eski sürümler (Android 12 ve önceki sürümler)

build_abi.sh aracını aşağıdaki gibi kullanın:

BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list

Bu örnekte build.config.device aşağıdaki yapılandırma seçeneklerini içermelidir:

  • vmlinux

    FILES listesinin bir parçası olmalıdır. Bunu yapmak için build.config.aarch64 ekleyebilirsiniz.

  • KMI_SYMBOL_LIST

    Güncelleme için ayarlanmalı ve KMI sembol listesine yönlendirilmelidir.

Cihaz simgesi listesini güncelledikten sonra bu değişiklikleri GKI derlemesine (common/build.config.gki.aarch64) de yansıtmanız gerekir:

  • Güncellenen simge listesini common/android/abi_gki_aarch64_<device> alanına kopyalayın.

  • android/abi_gki_aarch64_<device> değerinin common/build.config.gki.aarch64 içindeki ADDITIONAL_KMI_SYMBOL_LISTS değerine dahil edildiğinden emin olun.

  • Simgeleri ACK'ye gönderin.