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>