Pemeriksa penggunaan ABI bawaan

Library bersama Android berkembang dari waktu ke waktu. Menjaga biner bawaan tetap terbaru 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, pemeriksa penggunaan ABI berbasis simbol diperkenalkan. Pemeriksa dapat mendeteksi biner bawaan yang sudah usang pada waktu build, sehingga developer library bersama dapat mengetahui biner bawaan mana yang mungkin rusak oleh perubahannya dan biner bawaan mana yang harus di-build ulang.

Pemeriksa penggunaan ABI berbasis simbol

Pemeriksa penggunaan ABI berbasis simbol mengemulasikan linker dinamis Android di host. Pemeriksa menautkan biner bawaan dengan dependensi biner bawaan dan memeriksa apakah semua simbol yang tidak ditentukan di-resolve.

Pertama, pemeriksa 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 dalam LOCAL_SHARED_LIBRARIES atau shared_libs. Sistem build me-resolve 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 muncul.

Keempat, pemeriksa me-resolve simbol yang tidak ditentukan dalam biner bawaan. 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 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 simbol yang tidak ditentukan dan tidak dapat diselesaikan, tentukan salah satu opsi 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 agar waktu penyelesaian lebih cepat:

m check-elf-files

Perbaikan 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. Secara opsional, jalankan perbaikan dengan opsi --in-place untuk langsung mengupdate 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>