Simge listeleriyle çalışma

Kararlı olarak korunması gereken sembollerin ve türlerin yüzeyini küçültmek için GKI çekirdeği, dışa aktarılan sembolleri yalnızca modüllerin ihtiyaç duyduğu sembollerle sınırlama özelliğine sahiptir. Harici olarak derlenen modüllerin GKI çekirdeği tarafından dışa aktarılması için kullanılan sembollerin bir listesini oluşturmanız gerekir. Örneğin, Cuttlefish için modüller tarafından kullanılan semboller gki/aarch64/symbols/virtual_device içinde saklanır.

Sembol listesi oluşturma için hedef ekleme

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

  • name

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

  • kernel_build

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

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

  • kernel_modules

    Ağaç dışı modüllerin hedeflerinin listesi. In-tree modüller buraya dahil edilmemelidir. Prepare in-tree modules for symbol extraction (Sembol ayıklama için ağaç içi modülleri hazırlama) başlıklı makaleyi inceleyin.

  • kmi_symbol_list_add_only

    Bu seçenek, kullanılmayan sembollerin kaldırılmasını önler. Sembol kaldırma işlemine yalnızca KMI dengeleme sırasında belirli zamanlarda izin verilir ve KMI dondurulduktan sonra izin verilmez.

    Bu özellik, aynı sembol listesini birden fazla farklı cihazda kullandığınızda da yararlı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, sembole referans veren çekirdek modüllerine göre sembolleri gruplandırır. Aksi takdirde sembol listesi, tüm çekirdek modülleri tarafından kullanılan sembollerin sıralanmış bir listesidir.

Örneğin, bkz. common-modules/virtual-device/BUILD.bazel:

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 belgelerine de göz atın.

Sembol ayıklama için ağaç içi modülleri hazırlama

Ağaç içi modülleri sembol ayıklama için hazırlamak üzere, tedarikçiye özel ağaç içi modülleri kernel_build hedefinin module_outs özelliğinde listeleyin. Örnek için _VIRT_COMMON_MODULES ve kullanımı bölümüne bakın. Bu listeye GKI modüllerini dahil etmeyin.

Bu modülleri imzasız olarak yapılandırın. Aksi takdirde sembol 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, bkz. common-modules/virtual-device/virtual_device_core.fragment.

Cihaz çekirdeği derlemesine cihaz sembol listesi ekleme

Cihaz BUILD.bazel içinde tanımlanan kernel_build hedefine kmi_symbol_list özelliğini ekleyin. Sembol listesinin adı şu biçimde olmalıdır: //common:gki/<arch>/symbols/<device>.

Örneğin, common-modules/virtual-device/BUILD.bazel:

kernel_build(
    name = "virtual_device_aarch64",
    base_kernel = "//common:kernel_aarch64",
    kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
    ...
    module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)

İlk sembol listesini oluşturma ve gönderme

common/gki/<arch>/symbols/<device> konumunda boş bir sembol listesi oluştur. Yukarıdaki örnek için komut şu şekilde olur:

touch common/gki/aarch64/symbols/virtual_device

Bu dosyayı temel GKI çekirdek derlemesinin additional_kmi_symbol_lists bölümüne ekleyin. Örneğin, //common:gki/aarch64/symbols/virtual_device, common/BUILD.bazel içinde belirtilen aarch64_additional_kmi_symbol_lists dosya grubuna eklenir.

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

Cihaz sembolü listesini güncelleme

kernel_build'nin module_outs ve kernel_abi'nin kernel_modules bölümlerindeki modüller tarafından kullanılan tüm temel çekirdek sembolleri, sembol listesine dahil edilmelidir. Bu işlem, kernel_abi hedefi _update_symbol_list sonekiyle çalıştırılarak 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'ye sembol listesi güncellemesi gönderme

Yeni sembollerin KMI'nin bir parçası olması için sembol listesi değişikliği içeren bir yamayı Android Common Kernel gerrit'e gönderin.

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

Sembol listesi güncellemesi göndermeden önce referans ABI gösterimini güncellemek zorunlu olmasa da bu işlem, göndermeden önce yapılması gereken ek adımları ortadan kaldırabilir ve değişikliğin daha hızlı gönderilmesini sağlayabilir. Her durumda, göndermeden önce kontrol edilir ve gerekirse güncellenir.

Sembol listeleriyle çalışma (Android 13)

Android 13 hem Kleaf hem de eski derleme komut dosyalarını destekler. Bu nedenle, sembol listelerini önceki bölümlerde veya aşağıdaki bölümde açıklandığı şekilde yönetebilirsiniz.

Sembol listeleriyle çalışma (Android 12 ve önceki sürümler)

build_abi.sh aracını aşağıdaki şekilde 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 listesinde yer almalıdır. Bu işlem, build.config.aarch64 eklenerek yapılabilir.

  • KMI_SYMBOL_LIST

    Güncellenecek KMI sembol listesine ayarlanmalı ve bu listeye yönlendirilmelidir.

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

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

  • android/abi_gki_aarch64_<device> öğesinin common/build.config.gki.aarch64 içindeki ADDITIONAL_KMI_SYMBOL_LISTS öğesine dahil edildiğinden emin olun.

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