Biblioteki udostępnione Androida ewoluują z czasem. Utrzymywanie aktualności gotowych binarnych plików wymaga znacznego wysiłku. W Androidzie 9 lub starszym gotowe pliki binarne, które zależą od usuniętych bibliotek lub ABI, nie mogą być łączone w czasie wykonywania. Deweloperzy muszą prześledzić dzienniki, aby znaleźć przestarzałe wstępnie skompilowane pliki binarne. W Androidzie 10 wprowadzono sprawdzanie użycia ABI na podstawie symboli. Sprawdzacz może wykrywać nieaktualne gotowe pliki binarne w momencie kompilacji, dzięki czemu deweloperzy bibliotek udostępnianych mogą wiedzieć, które gotowe pliki binarne mogą zostać uszkodzone przez ich zmianę, a które muszą zostać ponownie skompilowane.
Sprawdzanie użycia interfejsu ABI na podstawie symboli
Sprawdzanie użycia ABI na podstawie symboli emuluje dynamiczny linker Androida na hoście. Sprawdzacz łączy z wyprzedzeniem skompilowany binarny z zależnościami tego binarnego i sprawdza, czy wszystkie niezdefiniowane symbole zostały rozwiązane.
Najpierw sprawdza architekturę docelową w gotowym binarnym pliku. Jeśli gotowy plik binarny nie jest przeznaczony dla architektury ARM, AArch64, x86 lub x86-64, sprawdzanie pomija gotowy plik binarny.
Po drugie, zależności w kompilowanym binarnym muszą być wymienione w LOCAL_SHARED_LIBRARIES
lub shared_libs
. System kompilacji przekształca nazwy modułów w odpowiednie warianty (np. core
w przeciwieństwie do vendor
) bibliotek udostępnionych.
Po trzecie, sprawdzacz porównuje wpisy DT_NEEDED
z LOCAL_SHARED_LIBRARIES
lub shared_libs
. W szczególności sprawdza, czy z każdej udostępnionej biblioteki wyodrębnione zostały wpisy DT_SONAME
i czy są one zgodne z wpisami DT_SONAME
zapisanymi w skompilowanym pliku binarnym.DT_NEEDED
Jeśli wystąpi niezgodność, zostanie wyświetlony komunikat o błędzie.
Po czwarte, sprawdzacz rozwiązuje niezdefiniowane symbole w kompilowanym binarnym pliku.
Te niezdefiniowane symbole muszą być zdefiniowane w jednym z zależnych plików, a wiązanie symboli musi być albo GLOBAL
, albo WEAK
. Jeśli nie można zdefiniować nieokreślonego symbolu, zostanie wyświetlony komunikat o błędzie.
Właściwości modułu gotowego
Zależnośći w gotowych plikach binarnych muszą być określone w jednym z tych dokumentów:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Jeśli gotowy plik binarny ma zawierać nierozwiązywalne symbole niezdefiniowane, określ jedno z tych ustawień:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Aby gotowy binarny plik binarny pomijał sprawdzanie pliku ELF, określ jedną z tych opcji:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Uruchamianie sprawdzania
Aby uruchomić sprawdzacz, ustaw zmienną środowiskową CHECK_ELF_FILES
na true
i uruchom make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
Aby włączyć sprawdzanie domyślnie, dodaj PRODUCT_CHECK_ELF_FILES
do BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
Wersje wstępnie skompilowane są automatycznie sprawdzane podczas procesu kompilacji Androida:
make