Pemeriksa Penggunaan ABI bawaan

Pustaka bersama Android berkembang dari waktu ke waktu. Menjaga binari prebuilt tetap up-to-date membutuhkan banyak usaha. Di Android 9 atau versi lebih lama, binari bawaan yang bergantung pada pustaka yang dihapus atau ABI hanya gagal ditautkan saat waktu proses. Pengembang harus melacak log untuk menemukan binari bawaan yang sudah ketinggalan zaman. Di Android 10, pemeriksa penggunaan ABI berbasis simbol diperkenalkan. Pemeriksa dapat mendeteksi binari bawaan yang kedaluwarsa pada waktu pembuatan, sehingga pengembang perpustakaan bersama dapat mengetahui binari bawaan mana yang mungkin rusak oleh perubahannya dan biner bawaan mana yang harus dibuat ulang.

Pemeriksa penggunaan ABI berbasis simbol

Pemeriksa penggunaan ABI berbasis simbol mengemulasi tautan dinamis Android di host. Pemeriksa menautkan biner bawaan dengan dependensi biner bawaan dan memeriksa apakah semua simbol yang tidak ditentukan diselesaikan.

Pertama, pemeriksa memeriksa arsitektur target dari biner bawaan. Jika biner bawaan tidak menargetkan arsitektur ARM, AArch64, x86, atau x86-64, pemeriksa akan melewatkan biner bawaan.

Kedua, dependensi biner bawaan harus terdaftar di LOCAL_SHARED_LIBRARIES atau shared_libs . Sistem pembangunan menyelesaikan nama modul ke varian yang cocok (yaitu core vs. vendor ) dari pustaka bersama.

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 membandingkan DT_SONAME ini dengan entri DT_NEEDED yang direkam dalam biner bawaan. Jika ada ketidaksesuaian, pesan kesalahan akan muncul.

Keempat, pemeriksa menyelesaikan simbol yang tidak ditentukan dalam biner yang dibuat sebelumnya. 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 muncul.

Properti modul bawaan

Dependensi biner bawaan harus ditentukan dalam salah satu dari berikut ini:

  • 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 dari berikut ini:

  • 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 prebuilt ELF selama proses build Android.

Untuk menjalankan pemeriksa sendiri untuk waktu penyelesaian yang 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 fixer 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>