Simge 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 derlenen 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, Mürekkep Balığı için modüller tarafından kullanılan simgeler android/abi_gki_aarch64_virtual_device içinde saklanır.

Simge listesi oluşturma 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

    kernel_build hedef cihazın adını içermelidir.

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

  • kernel_modules

    Ağa bağlı olmayan modüllerin hedeflerinin listesi. Ağa bağlı 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. Semboller yalnızca KMI sabitlenirken belirli zamanlarda kaldırılabilir. KMI dondurulduğunda ise sembol kaldırma işlemine izin verilmez.

    Bu, aynı simge listesini birden fazla farklı cihazda kullandığınızda da yararlı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 simge gruplandırır. Aksi takdirde, simge listesi tüm çekirdek modülleri tarafından kullanılan simgelerin sıralanmış bir listesidir.

Örneğin, common-modules/virtual-device/BUILD.bazel dosyasına bakın:

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 simgelerin KMI'nin bir parçası olması için simge listesi değişikliğini içeren bir yama göndererek Android Ortak Çekirdeği Gerrit'e gönderin.

Taahhüt mesajı, eklenen veya kaldırılan simgelerin 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 simge 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.