Library bersama Android berkembang dari waktu ke waktu. Memperbarui biner bawaan memerlukan upaya yang cukup besar. Di Android 9 atau yang lebih lama, biner bawaan yang bergantung pada library atau ABI yang dihapus hanya gagal ditautkan saat runtime. Developer harus melacak log untuk menemukan biner bawaan yang sudah tidak berlaku. Di Android 10, diperkenalkan pemeriksa penggunaan ABI berbasis simbol. Pemeriksa dapat mendeteksi biner bawaan yang sudah usang pada waktu build, sehingga developer library bersama dapat mengetahui biner bawaan mana yang mungkin rusak akibat perubahan mereka dan biner bawaan mana yang harus dibangun ulang.
Pemeriksa penggunaan ABI berbasis simbol
Pemeriksa penggunaan ABI berbasis simbol meniru linker dinamis Android di host. Pemeriksa menautkan biner bawaan dengan dependensi biner bawaan dan memeriksa apakah semua simbol yang tidak ditentukan telah diselesaikan.
Pertama, pemeriksa akan memeriksa arsitektur target 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 di
LOCAL_SHARED_LIBRARIES
atau shared_libs
. Sistem build menyelesaikan nama modul ke varian yang cocok (yaitu core
vs. vendor
) dari library bersama.
Ketiga, pemeriksa membandingkan entri DT_NEEDED
dengan LOCAL_SHARED_LIBRARIES
atau shared_libs
. Secara khusus, pemeriksa mengekstrak entri DT_SONAME
dari setiap library bersama dan membandingkan DT_SONAME
ini dengan entri DT_NEEDED
yang dicatat dalam biner bawaan. Jika ada ketidakcocokan, pesan
error akan ditampilkan.
Keempat, pemeriksa menyelesaikan simbol yang tidak ditentukan dalam biner yang telah dibuat sebelumnya. Simbol yang tidak ditentukan tersebut harus ditentukan dalam salah satu dependensi dan binding simbol harus berupa GLOBAL
atau WEAK
. Jika simbol yang tidak ditentukan tidak dapat diselesaikan, pesan error akan ditampilkan.
Properti modul bawaan
Dependensi biner bawaan harus ditentukan dalam salah satu hal berikut:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Jika biner bawaan dirancang untuk memiliki beberapa simbol tidak terdefinisi yang tidak dapat diselesaikan, tentukan salah satu 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 opsi berikut:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Menjalankan pemeriksa
Pemeriksa ini mencakup semua modul bawaan ELF selama proses build Android.
Untuk menjalankan pemeriksa saja agar waktu penyelesaian lebih cepat:
m check-elf-files
Perbaikan error ABI
Perbaikan otomatis dapat membantu menyelesaikan error pemeriksaan ABI. Cukup jalankan fixer dengan
Android.bp / Android.mk sebagai input, dan fixer akan mencetak saran
perbaikan ke stdout. Secara opsional, jalankan fixer 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>