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>
öğesinincommon/build.config.gki.aarch64
içindekiADDITIONAL_KMI_SYMBOL_LISTS
öğesine dahil edildiğinden emin olun.