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 tidak berlaku pada waktu build, sehingga developer library bersama dapat mengetahui biner bawaan mana yang mungkin rusak oleh perubahan mereka dan biner bawaan mana yang harus di-build ulang.
Pemeriksa penggunaan ABI berbasis simbol
Pemeriksa penggunaan ABI berbasis simbol mengemulasikan Android dynamic linker di host. Pemeriksa menautkan biner bawaan dengan dependensi biner bawaan dan memeriksa apakah semua simbol yang tidak ditentukan telah 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
akan 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 terjadi
ketidakcocokan, pesan error akan ditampilkan.
Keempat, pemeriksa me-resolve simbol yang tidak ditentukan dalam biner bawaan.
Simbol yang tidak ditentukan tersebut harus ditentukan di salah satu dependensi dan
binding simbol harus berupa GLOBAL
atau WEAK
. Jika
simbol yang tidak ditentukan tidak dapat diselesaikan, pesan error akan ditampilkan.
Properti modul bawaan
Dependensi biner bawaan harus ditentukan di 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 yang tidak dapat di-resolve dan tidak ditentukan, tentukan salah satu dari 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
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
Build bawaan diperiksa secara otomatis selama proses build Android:
make