Library bersama Android berkembang dari waktu ke waktu. Menyimpan biner bawaan tetap {i>up-to-date<i} membutuhkan upaya yang cukup besar. Di Android 9 atau yang lebih lama, biner bawaan yang hanya bergantung pada library atau ABI yang telah dihapus gagal menautkan pada saat run-time. Developer harus melacak log untuk menemukan log usang biner bawaan. Di Android 10, ABI berbasis simbol pemeriksa penggunaan diperkenalkan. Pemeriksa dapat mendeteksi biner bawaan yang sudah tidak berlaku pada waktu build, sehingga developer library bersama bisa mengetahui jenis library mungkin rusak oleh perubahan mereka dan biner bawaan mana yang harus dibangun kembali.
Pemeriksa penggunaan ABI berbasis simbol
Pemeriksa penggunaan ABI berbasis simbol mengemulasikan linker dinamis Android pada host. Pemeriksa menautkan biner bawaan dengan dependensi objek bawaan biner dan memeriksa apakah semua simbol yang tidak ditentukan telah diselesaikan.
Pertama-tama, pemeriksa akan memeriksa arsitektur target dari biner bawaan. Jika biner bawaan tidak menargetkan arsitektur ARM, AArch64, x86, atau x86-64, pemeriksa melewati biner bawaan.
Kedua, dependensi biner bawaan
harus tercantum dalam
LOCAL_SHARED_LIBRARIES
atau shared_libs
. Sistem build me-resolve modul
nama dengan varian yang cocok (yaitu core
vs. vendor
) dari varian yang dibagikan
library.
Ketiga, pemeriksa membandingkan entri DT_NEEDED
dengan LOCAL_SHARED_LIBRARIES
atau shared_libs
. Secara khusus, pemeriksa mengekstrak entri DT_SONAME
dari
setiap pustaka bersama dan membandingkannya dengan DT_SONAME
dengan DT_NEEDED
entri yang direkam dalam biner bawaan. Jika ada ketidakcocokan, maka error
pesan dimunculkan.
Keempat, pemeriksa me-resolve simbol yang tidak ditentukan dalam biner bawaan. Mereka
simbol yang tidak ditentukan harus didefinisikan dalam salah satu dependensi
binding harus GLOBAL
atau WEAK
. Jika simbol yang tidak
didefinisikan tidak dapat
diselesaikan, sebuah pesan {i>error<i} akan muncul.
Properti modul bawaan
Dependensi biner bawaan harus ditentukan dalam salah satu opsi berikut:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Jika biner bawaan didesain untuk memiliki beberapa file tidak ditentukan yang tidak dapat simbol, tentukan salah satu dari hal berikut:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Agar biner bawaan tidak lolos pemeriksaan file ELF, tentukan salah satu berikut ini:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Menjalankan pemeriksa
Pemeriksa mencakup semua modul bawaan ELF selama proses build Android.
Untuk menjalankan pemeriksa saja guna waktu penyelesaian yang lebih cepat:
m check-elf-files
Pemecah error ABI
Pemecah masalah otomatis dapat membantu mengatasi error pemeriksaan ABI. Cukup jalankan {i>fixer<i} dengan
Android.bp / Android.mk sebagai input, dan pemecah masalah akan mencetak
ke {i>stdout<i}. Atau, jalankan pemecah masalah dengan opsi --in-place
untuk
memperbarui Android.bp / Android.mk secara langsung dengan perbaikan yang disarankan.
Untuk Android.bp,
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>
Untuk Android.mk,
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>