Pemeriksa Penggunaan ABI bawaan

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>