Sembol listeleriyle nasıl çalışılır?

Sabit tutulması gereken sembollerin ve türlerin yüzeyini azaltmak için GKI çekirdeği, dışa aktarılan sembolleri yalnızca modüllerin ihtiyaç duyduğu sembollerle sınırlama işlevine sahiptir. Harici olarak derlenen modüller için, bunların GKI çekirdeği tarafından dışa aktarılabilmesini sağlamak amacıyla kullanılan sembollerin bir listesine sahip olmanız gerekir. Örneğin, Mürekkepbalığı modülleri tarafından kullanılan semboller android/abi_gki_aarch64_virtual_device dosyasında depolanır.

Sembol listesi oluşturmak için bir hedef ekleyin

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

  • name

    <kernel_build>_abi formatında olmalıdır.

  • kernel_build

    kernel_build hedefinin adını içermelidir.

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

  • kernel_modules

    Ağaç dışı modüller için hedeflerin listesi. Ağaç içi modüller buraya dahil edilmemelidir. Sembol çıkarma için ağaç içi modülleri hazırlama konusuna bakın.

  • kmi_symbol_list_add_only

    Bu seçenek kullanılmayan simgelerin kaldırılmasını engeller. Sembolün kaldırılmasına yalnızca KMI stabilizasyonu sırasında belirli zamanlarda izin verilir ve KMI dondurulduktan sonra buna izin verilmez.

    Bu aynı zamanda birden fazla farklı cihaz için aynı sembol listesini kullandığınızda da kullanışlıdır. Bu şekilde A cihazı tarafından kullanılan ancak B cihazı tarafından kullanılmayan semboller kaldırılmaz.

  • module_grouping

    True veya belirtilmemişse, sembol listesi sembolleri, sembole başvuran çekirdek modüllerine göre gruplandırır. Aksi takdirde sembol listesi, tüm çekirdek modülleri tarafından kullanılan sembollerin sıralanmış bir listesi olacaktır.

Örneğin common-modules/virtual-device/BUILD.bazel'e 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,
)

Ayrıca Kleaf'teki kernel_abi hedefiyle ilgili referans belgelere bakın.

Sembol çıkarımı için ağaç içi modüller hazırlama

Ağaç içi modülleri sembol çıkarımına hazırlamak için, satıcıya özgü ağaç içi modülleri kernel_build hedefinin module_outs özelliğinde listeleyin. Örnek için _VIRT_COMMON_MODULES ve kullanımına bakın. Bu listeye GKI modüllerini dahil etmeyin.

Bu modülleri imzasız olacak şekilde yapılandırın, aksi halde sembol listesi boş olabilir. Bunu yapmak için bu satırı çekirdek yapılandırma parçalarınıza ekleyin:

# CONFIG_MODULE_SIG_ALL is not set

Örneğin common-modules/virtual-device/virtual_device_core.fragment'e bakın.

Cihaz çekirdeği yapısına bir cihaz sembolü listesi ekleme

BUILD.bazel aygıtında tanımlanan kernel_build hedefine kmi_symbol_list niteliğini ekleyin. Sembol listesinin adı //common:android/abi_gki_<arch>_<device> formatında olmalıdır. Örneğin common-modules/virtual-device/BUILD.bazel'e 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,
)

Bir başlangıç ​​sembol listesi oluşturup gönderin

common/android/abi_gki_<arch>_<device> adresinde boş bir sembol listesi oluşturun. Yukarıdaki örnek için komut şöyle olacaktır:

touch common/android/abi_gki_aarch64_virtual_device

Bu dosyayı temel GKI çekirdek yapısının additional_kmi_symbol_lists ekleyin. Örneğin, //common:android/abi_gki_aarch64_virtual_device , common/BUILD.bazel dosyasında bildirilen aarch64_additional_kmi_symbol_lists dosya grubuna eklenir.

Yeni sembol listesini doldurmak için cihaz sembol listesini güncelleyin ve bunu Android Common Kernel deposuna gönderin.

Cihaz sembolü listesini güncelleme

kernel_build module_outs ve kernel_abi kernel_modules modüller tarafından kullanılan tüm çekirdek çekirdek sembolleri, sembol listesine dahil edilmelidir. Bu, kernel_abi hedefini _update_symbol_list sonekiyle çalıştırarak yapılabilir. Örneğin, aşağıdaki komut //common-modules/virtual-device:virtual_device_aarch64 için sembol listesini günceller:

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

ACK'ya bir sembol listesi güncellemesi gönder

Yeni sembolleri KMI'nin bir parçası haline getirmek için Android Common Kernel gerrit'ine sembol listesi değişikliğini içeren bir yama gönderin.

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

Bir sembol listesi güncellemesi göndermeden önce referans ABI gösteriminin güncellenmesi gerekli olmasa da, ekstra ön gönderim adımlarını ortadan kaldırabilir ve değişikliğin daha hızlı gönderilmeye hazır olmasını sağlayabilir. Her durumda, ön gönderim sırasında kontrol edilecek ve gerekirse güncellenecektir.

Eski sürümler (Android 12 ve altı)

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 şu yapılandırma seçeneklerini içermelidir:

  • vmlinux

    FILES listesinin bir parçası olmalıdır. Bu, build.config.aarch64 eklenerek yapılabilir.

  • KMI_SYMBOL_LIST

    Güncellemek için ayarlanmalı ve KMI sembol listesine işaret edilmelidir.

Cihaz sembolü listesini güncelledikten sonra, bu değişiklikleri GKI yapısına da yansıtmanız gerekir ( common/build.config.gki.aarch64 ):

  • Güncellenen sembol listesini common/android/abi_gki_aarch64_<device> dizinine kopyalayın.

  • android/abi_gki_aarch64_<device> common/build.config.gki.aarch64 dosyasındaki ADDITIONAL_KMI_SYMBOL_LISTS listesine dahil edilip edilmediğini kontrol edin.

  • Sembol listesi güncellemesini ACK'ye gönder .