Pemeriksa penggunaan ABI bawaan

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>