Gotowy sprawdzacz użycia interfejsu ABI

Biblioteki udostępnione na Androidzie są od czasu do czasu rozwijane. Aktualizowanie wstępnie skompilowanych plików binarnych wymaga znacznego wysiłku. W Androidzie 9 lub starszym wstępnie skompilowane pliki binarne, które zależą od usuniętych bibliotek lub interfejsów ABI, nie są łączone w czasie działania. Deweloperzy muszą prześledzić logi, aby znaleźć nieaktualne wstępnie skompilowane pliki binarne. W Androidzie 10 wprowadzono narzędzie do sprawdzania użycia interfejsu ABI oparte na symbolach. Sprawdzanie może wykrywać nieaktualne wstępnie skompilowane pliki binarne w czasie kompilacji, dzięki czemu programiści bibliotek współdzielonych mogą wiedzieć, które wstępnie skompilowane pliki binarne mogą zostać uszkodzone przez ich zmianę i które z nich należy ponownie skompilować.

Sprawdzanie użycia interfejsu ABI na podstawie symboli

Sprawdzanie użycia interfejsu ABI opartego na symbolach emuluje dynamiczny linker Androida na hoście. Sprawdzarka łączy wstępnie skompilowany plik binarny z zależnościami wstępnie skompilowanego pliku binarnego i sprawdza, czy wszystkie niezdefiniowane symbole zostały rozwiązane.

Najpierw sprawdza architekturę docelową wstępnie skompilowanego pliku binarnego. Jeśli wstępnie skompilowany plik binarny nie jest przeznaczony dla architektury ARM, AArch64, x86 ani x86-64, narzędzie sprawdzające go pomija.

Po drugie, zależności wstępnie skompilowanego pliku binarnego muszą być wymienione w zasadzie LOCAL_SHARED_LIBRARIES lub shared_libs. System kompilacji rozpoznaje nazwy modułów i dopasowuje je do odpowiedniej wersji (np. core lub vendor) bibliotek współdzielonych.

Po trzecie, narzędzie porównuje wpisy DT_NEEDED z wartościami LOCAL_SHARED_LIBRARIES lub shared_libs. W szczególności narzędzie wyodrębnia wpis DT_SONAME z każdej biblioteki współdzielonej i porównuje go z wpisami DT_NEEDED zarejestrowanymi w wcześniej skompilowanym pliku binarnym.DT_SONAME Jeśli wystąpi niezgodność, pojawi się komunikat o błędzie.

Po czwarte, narzędzie do sprawdzania rozwiązuje niezdefiniowane symbole w wstępnie skompilowanym pliku binarnym. Te niezdefiniowane symbole muszą być zdefiniowane w jednym z elementów zależnych, a powiązanie symbolu musi mieć wartość GLOBAL lub WEAK. Jeśli nie można rozpoznać niezdefiniowanego symbolu, wyświetlany jest komunikat o błędzie.

Właściwości modułu wstępnie utworzonych elementów

Zależności wstępnie skompilowanego pliku binarnego muszą być określone w jeden z tych sposobów:

  • Android.bp: shared_libs: ["libc", "libdl", "libm"],
  • Android.mk: LOCAL_SHARED_LIBRARIES := libc libdl libm

Jeśli wstępnie skompilowany plik binarny ma zawierać nierozwiązywalne niezdefiniowane symbole, określ jedną z tych wartości:

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Aby wstępnie skompilowany plik binarny pominął sprawdzanie pliku ELF, określ jedną z tych opcji:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

Uruchamianie narzędzia sprawdzającego

Sprawdzanie obejmuje wszystkie gotowe moduły ELF podczas procesu kompilacji Androida.

Aby uruchomić narzędzie do sprawdzania samodzielnie i skrócić czas oczekiwania:

m check-elf-files

Narzędzie do naprawiania błędów interfejsu ABI

Automatyczny moduł naprawczy może pomóc w rozwiązaniu błędów sprawdzania interfejsu ABI. Wystarczy uruchomić narzędzie do naprawy, podając jako dane wejściowe plik Android.bp lub Android.mk. Narzędzie wydrukuje proponowaną poprawkę na standardowe wyjście. Opcjonalnie możesz uruchomić narzędzie do naprawy z opcją --in-place, aby bezpośrednio zaktualizować plik Android.bp lub Android.mk za pomocą sugerowanej poprawki.

W przypadku pliku 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 przypadku 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>