Perpustakaan bersama Android berkembang dari waktu ke waktu. Menjaga agar biner bawaan tetap mutakhir memerlukan upaya yang besar. Di Android 9 atau versi lebih lama, biner bawaan yang bergantung pada pustaka atau ABI yang dihapus hanya gagal ditautkan pada waktu proses. Pengembang harus melacak log untuk menemukan biner bawaan yang sudah ketinggalan zaman. Di Android 10, pemeriksa penggunaan ABI berbasis simbol diperkenalkan. Pemeriksa dapat mendeteksi biner bawaan yang sudah ketinggalan zaman pada waktu pembuatan, sehingga pengembang perpustakaan bersama dapat mengetahui biner bawaan mana yang mungkin rusak karena perubahannya dan biner bawaan mana yang harus dibuat ulang.
Pemeriksa penggunaan ABI berbasis simbol
Pemeriksa penggunaan ABI berbasis simbol mengemulasi linker dinamis Android pada host. Pemeriksa menghubungkan biner bawaan dengan dependensi biner bawaan dan memeriksa apakah semua simbol yang tidak terdefinisi telah teratasi.
Pertama, pemeriksa memeriksa arsitektur target biner bawaan. Jika biner bawaan tidak menargetkan arsitektur ARM, AArch64, x86, atau x86-64, pemeriksa akan melewatkan biner bawaan.
Kedua, dependensi biner bawaan harus dicantumkan dalam LOCAL_SHARED_LIBRARIES
atau shared_libs
. Sistem pembangunan menyelesaikan nama modul ke varian yang cocok (yaitu core
vs. vendor
) dari perpustakaan bersama.
Ketiga, pemeriksa membandingkan entri DT_NEEDED
dengan LOCAL_SHARED_LIBRARIES
atau shared_libs
. Secara khusus, pemeriksa mengekstrak entri DT_SONAME
dari setiap perpustakaan bersama dan membandingkan DT_SONAME
ini dengan entri DT_NEEDED
yang dicatat dalam biner bawaan. Jika ada ketidakcocokan, pesan kesalahan akan dikeluarkan.
Keempat, pemeriksa menyelesaikan simbol-simbol yang tidak terdefinisi dalam biner bawaan. Simbol-simbol yang tidak terdefinisi tersebut harus didefinisikan dalam salah satu dependensi dan pengikatan simbol harus berupa GLOBAL
atau WEAK
. Jika simbol yang tidak ditentukan tidak dapat diselesaikan, pesan kesalahan akan dikeluarkan.
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 tak 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 hal berikut:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Jalankan pemeriksa
Pemeriksa mencakup semua modul bawaan ELF selama proses pembuatan Android.
Untuk menjalankan pemeriksa sendiri agar waktu penyelesaian lebih cepat:
m check-elf-files
Pemecah kesalahan ABI
Pemecah masalah otomatis dapat membantu mengatasi kesalahan pemeriksaan ABI. Cukup jalankan fixer dengan Android.bp / Android.mk sebagai input, dan fixer akan mencetak perbaikan yang disarankan ke stdout. Secara opsional, jalankan pemecah masalah dengan opsi --in-place
untuk langsung memperbarui Android.bp / Android.mk 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>