Gotowy sprawdzacz użycia interfejsu ABI

Biblioteki udostępnione Androida ewoluują z czasem. Utrzymywanie aktualności gotowych plików binarnych wymaga znacznego wysiłku. Android 9 gotowe pliki binarne zależne tylko od usuniętych bibliotek lub interfejsów ABI nie udało się połączyć w czasie wykonywania. Deweloperzy muszą prześledzić logi, aby znaleźć nieaktualne oprogramowanie. gotowych plików binarnych. W Androidzie 10 wprowadzono sprawdzanie użycia ABI na podstawie symboli. Sprawdzacz może wykrywać nieaktualne gotowe binarne pliki binarne w czasie kompilacji, aby deweloperzy bibliotek wspólnych wiedzieli, które gotowe binarne pliki binarne mogą być uszkodzone przez ich zmianę i które muszą zostać ponownie skompilowane.

Oparty na symbolach wskaźnik wykorzystania interfejsu ABI

Sprawdzacz użycia ABI na podstawie symboli emuluje dynamiczny linker Androida na hoście. Sprawdza on, czy wszystkie niezdefiniowane symbole zostały rozwiązane.

Najpierw sprawdza architekturę docelową w gotowym binarnym pliku. Jeśli gotowy binarny plik nie jest przeznaczony dla architektury ARM, AArch64, x86 ani x86-64, sprawdzanie pomija gotowy binarny plik.

Po drugie: zależności gotowego pliku binarnego LOCAL_SHARED_LIBRARIES lub shared_libs. System kompilacji przekształca nazwy modułów w odpowiednią wersję (np. core lub vendor) udostępnionych bibliotek.

Po trzecie, sprawdzacz porównuje wpisy DT_NEEDED z LOCAL_SHARED_LIBRARIES lub shared_libs. Narzędzie do sprawdzania wyodrębnia w szczególności wpis DT_SONAME z: wszystkich bibliotek udostępnionych i porównuje te DT_SONAME z biblioteką DT_NEEDED zapisane w gotowym pliku binarnym. W przypadku niezgodności pojawi się komunikat jest wysyłany komunikat.

Po czwarte, narzędzie sprawdza niezdefiniowane symbole w gotowym pliku binarnym. Te wartości niezdefiniowane symbole muszą być zdefiniowane w jednej z zależności i symbolu powiązanie musi mieć wartość GLOBAL lub WEAK. Jeśli nie można rozwiązać niezdefiniowanego symbolu, zostanie wyświetlony komunikat o błędzie.

Właściwości modułu gotowego

Zależnośći w gotowym pliku binarnym 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 jest zaprojektowany w taki sposób, aby zawierał nierozwiązane, niezdefiniowane , wybierz jeden z tych elementów:

  • 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

Sprawdzanie obejmuje wszystkie wstępnie skompilowane moduły ELF podczas procesu kompilacji Androida.

Aby przyspieszyć proces sprawdzania, uruchamiając tylko narzędzie:

m check-elf-files

Naprawianie błędów ABI

Automatyczne narzędzie do naprawy może pomóc w rozwiązywaniu błędów sprawdzania ABI. Wystarczy uruchomić narzędzie z plikiem Android.bp lub Android.mk jako wejściem, a narzędzie wydrukuje sugerowane poprawki na wyjściu standardowym. Opcjonalnie możesz uruchomić narzędzie do naprawiania z opcją --in-place, aby bezpośrednio zaktualizować plik Android.bp lub Android.mk za pomocą sugerowanej poprawki.

W przypadku Android.bp:

m fix_android_bp_prebuilt
# Print the fixed Android.bp to stdout.
fix_android_bp_prebuilt <path-to-Android.bp>
# Update the Android.bp in place.
fix_android_bp_prebuilt --in-place <path-to-Android.bp>

W pliku Android.mk:

m fix_android_mk_prebuilt
# Print the fixed Android.mk to stdout.
fix_android_mk_prebuilt <path-to-Android.mk>
# Update the Android.mk in place.
fix_android_mk_prebuilt --in-place <path-to-Android.mk>