Gotowy sprawdzacz użycia interfejsu ABI

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