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 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>