Önceden Oluşturulmuş ABI Kullanım Denetleyicisi

Android paylaşımlı kitaplıkları zaman zaman gelişir. Önceden oluşturulmuş ikili dosyaları güncel tutmak büyük çaba gerektirir. Android 9 veya önceki sürümlerde, kaldırılan kitaplıklara veya ABI'lere bağlı olan önceden oluşturulmuş ikili dosyalar yalnızca çalışma zamanında bağlantı kuramaz. Geliştiricilerin, eski, önceden oluşturulmuş ikili dosyaları bulmak için günlükleri izlemesi gerekir. Android 10'da sembol tabanlı bir ABI kullanım denetleyicisi tanıtıldı. Denetleyici, güncel olmayan önceden oluşturulmuş ikili dosyaları derleme sırasında algılayabilir; böylece paylaşılan kitaplık geliştiricileri, hangi önceden oluşturulmuş ikili dosyaların değişiklik nedeniyle bozulabileceğini ve hangi önceden oluşturulmuş ikili dosyaların yeniden oluşturulması gerektiğini bilebilir.

Sembol tabanlı ABI kullanım denetleyicisi

Sembol tabanlı ABI kullanım denetleyicisi, ana bilgisayardaki Android dinamik bağlayıcıyı taklit eder. Denetleyici, önceden oluşturulmuş ikili dosyayı önceden oluşturulmuş ikili dosyanın bağımlılıklarıyla bağlar ve tanımlanmamış tüm sembollerin çözümlenip çözümlenmediğini kontrol eder.

İlk olarak denetleyici, önceden oluşturulmuş ikili dosyanın hedef mimarisini kontrol eder. Önceden oluşturulmuş ikili dosya ARM, AArch64, x86 veya x86-64 mimarisini hedeflemiyorsa denetleyici önceden oluşturulmuş ikili dosyayı atlar.

İkinci olarak, önceden oluşturulmuş ikili dosyanın bağımlılıkları LOCAL_SHARED_LIBRARIES veya shared_libs listelenmelidir. Derleme sistemi, modül adlarını paylaşılan kitaplıkların eşleşen değişkenine (yani core ve vendor ) çözer.

Üçüncü olarak denetleyici, DT_NEEDED girişlerini LOCAL_SHARED_LIBRARIES veya shared_libs ile karşılaştırır. Özellikle denetleyici, her paylaşılan kitaplıktan DT_SONAME girişini çıkarır ve bu DT_SONAME önceden oluşturulmuş ikili dosyada kayıtlı DT_NEEDED girişleriyle karşılaştırır. Uyumsuzluk olması durumunda bir hata mesajı verilir.

Dördüncüsü, denetleyici önceden oluşturulmuş ikili dosyadaki tanımlanmamış sembolleri çözer. Bu tanımlanmamış semboller bağımlılıklardan birinde tanımlanmalı ve sembol bağlaması GLOBAL veya WEAK olmalıdır. Tanımlanmamış bir sembol çözülemezse bir hata mesajı verilir.

Önceden oluşturulmuş modül özellikleri

Önceden oluşturulmuş ikili dosyanın bağımlılıkları aşağıdakilerden birinde belirtilmelidir:

  • Android.bp: shared_libs: ["libc", "libdl", "libm"],
  • Android.mk: LOCAL_SHARED_LIBRARIES := libc libdl libm

Önceden oluşturulmuş ikili dosya bazı çözülemeyen tanımsız sembollere sahip olacak şekilde tasarlanmışsa aşağıdakilerden birini belirtin:

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Önceden oluşturulmuş ikili programın ELF dosya kontrolünü atlaması için aşağıdakilerden birini belirtin:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

Denetleyiciyi çalıştır

Denetleyici, Android derleme süreci sırasında tüm ELF önceden oluşturulmuş modüllerini kapsar.

Daha hızlı geri dönüş süreleri elde etmek amacıyla denetleyiciyi tek başına çalıştırmak için:

m check-elf-files

ABI hata giderici

Otomatik düzeltici, ABI kontrol hatalarının çözülmesine yardımcı olabilir. Düzelticiyi giriş olarak Android.bp / Android.mk ile çalıştırmanız yeterlidir; düzeltici, önerilen düzeltmeyi stdout'a yazdıracaktır. İsteğe bağlı olarak, Android.bp / Android.mk dosyasını önerilen düzeltmeyle doğrudan güncellemek için düzelticiyi --in-place seçeneğiyle çalıştırın.

Android.bp için,

m fix_android_bp_prebuilt
# Print the fixed Android.bp to stdout.
fix_android_bp_prebuilt <path-to-Android.bp>
# Update the Android.bp in place.
fix_android_bp_prebuilt --in-place <path-to-Android.bp>

Android.mk için,

m fix_android_mk_prebuilt
# Print the fixed Android.mk to stdout.
fix_android_mk_prebuilt <path-to-Android.mk>
# Update the Android.mk in place.
fix_android_mk_prebuilt --in-place <path-to-Android.mk>