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 biner bawaan yang sudah tidak berlaku. Di Android 10, pemeriksa penggunaan ABI berbasis simbol 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 ulang.
Pemeriksa penggunaan ABI berbasis simbol
Pemeriksa penggunaan ABI berbasis simbol mengemulasikan linker dinamis Android di 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 akan melewati biner bawaan.
Kedua, dependensi biner bawaan harus dicantumkan 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 ditentukan tidak dapat
di-resolve, pesan error akan ditampilkan.
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 melewati pemeriksaan file ELF, tentukan salah satu hal berikut:
- 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
Perbaikan otomatis dapat membantu menyelesaikan error pemeriksaan ABI. Cukup jalankan perbaikan dengan
Android.bp/Android.mk sebagai input, dan perbaikan akan mencetak perbaikan
yang disarankan ke stdout. 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>