Pemeriksa penggunaan ABI bawaan

Library bersama Android berkembang dari waktu ke waktu. Menyimpan biner bawaan tetap diperbarui membutuhkan upaya yang cukup besar. Di Android 9 atau sebelumnya, biner bawaan yang bergantung pada atau ABI yang dihapus hanya gagal ditautkan saat run-time. Developer harus melacak log untuk menemukan biner bawaan yang usang. Di Android 10, pemeriksa penggunaan ABI berbasis simbol akan diperkenalkan. Pemeriksa dapat mendeteksi biner bawaan yang sudah usang pada waktu build, sehingga developer library dapat mengetahui biner bawaan mana yang mungkin rusak oleh ubah dan biner bawaan mana yang harus dibuat ulang.

Pemeriksa penggunaan ABI berbasis simbol

Pemeriksa penggunaan ABI berbasis simbol mengemulasikan linker dinamis Android di {i>host<i}. Pemeriksa menautkan biner bawaan dengan dependensi biner bawaan 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 ARM, AArch64, x86, atau x86-64 arsitektur ini, pemeriksa akan melewati biner bawaan.

Kedua, dependensi biner bawaan harus tercantum dalam LOCAL_SHARED_LIBRARIES atau shared_libs. Build sistem akan me-resolve nama modul ke varian yang cocok (yaitu core vs. vendor) library bersama.

Ketiga, pemeriksa membandingkan entri DT_NEEDED dengan LOCAL_SHARED_LIBRARIES atau shared_libs. Secara khusus, kita akan membuat pemeriksa mengekstrak entri DT_SONAME dari setiap item yang dibagikan library dan membandingkannya dengan DT_SONAME DT_NEEDED entri direkam dalam biner bawaan. Jika ada tidak cocok, sebuah pesan {i>error <i}akan dimunculkan.

Keempat, pemeriksa me-resolve simbol yang tidak ditentukan dalam biner bawaan. Simbol-simbol yang tidak ditentukan tersebut harus didefinisikan dalam salah satu dependensi binding simbol harus GLOBAL atau WEAK. Jika simbol yang tidak ditentukan tidak dapat diselesaikan, pesan {i>error<i} akan dimunculkan.

Properti modul bawaan

Dependensi biner bawaan harus ditentukan dalam salah satu berikut ini:

  • Android.bp: shared_libs: ["libc", "libdl", "libm"],
  • Android.mk: LOCAL_SHARED_LIBRARIES := libc libdl libm

Jika biner bawaan dirancang untuk memiliki simbol yang tidak ditentukan dan tidak dapat diselesaikan, tentukan salah satu 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

Untuk menjalankan pemeriksa, tetapkan variabel lingkungan CHECK_ELF_FILES ke true dan jalankan make check-elf-files:

CHECK_ELF_FILES=true make check-elf-files

Untuk mengaktifkan pemeriksa secara default, tambahkan PRODUCT_CHECK_ELF_FILES ke BoardConfig.mk:

PRODUCT_CHECK_ELF_FILES := true

Bawaan otomatis diperiksa selama proses build Android:

make