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