Wstępnie zbudowany moduł sprawdzający wykorzystanie ABI

Biblioteki współdzielone Androida od czasu do czasu ewoluują. Aktualizowanie gotowych plików binarnych wymaga znacznego wysiłku. W systemie Android 9 lub starszym wstępnie skompilowane pliki binarne, które zależą od usuniętych bibliotek lub interfejsów ABI, nie łączą się tylko w czasie wykonywania. Programiści muszą prześledzić dzienniki, aby znaleźć przestarzałe, wstępnie skompilowane pliki binarne. W systemie Android 10 wprowadzono narzędzie do sprawdzania użycia ABI oparte na symbolach. Moduł sprawdzający może wykryć nieaktualne, wstępnie skompilowane pliki binarne w czasie kompilacji, dzięki czemu twórcy bibliotek współdzielonych mogą wiedzieć, które wstępnie skompilowane pliki binarne mogą zostać uszkodzone w wyniku ich zmian, a które wstępnie skompilowane pliki binarne wymagają ponownego zbudowania.

Narzędzie do sprawdzania użycia ABI opartego na symbolach

Narzędzie do sprawdzania użycia ABI opartego na symbolach emuluje dynamiczny linker systemu Android na hoście. Moduł sprawdzający łą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 moduł sprawdzający sprawdza docelową architekturę prekompilowanego pliku binarnego. Jeśli wstępnie skompilowany plik binarny nie jest przeznaczony dla architektury ARM, AArch64, x86 lub x86-64, moduł sprawdzający pomija wstępnie skompilowany plik binarny.

Po drugie, zależności prekompilowanego pliku binarnego muszą być wymienione w LOCAL_SHARED_LIBRARIES lub shared_libs . System kompilacji tłumaczy nazwy modułów na odpowiadający im wariant (tj. core vs. vendor ) bibliotek współdzielonych.

Po trzecie, moduł sprawdzający porównuje wpisy DT_NEEDED z LOCAL_SHARED_LIBRARIES lub shared_libs . W szczególności moduł sprawdzający wyodrębnia wpis DT_SONAME z każdej biblioteki współdzielonej i porównuje te wpisy DT_SONAME z wpisami DT_NEEDED zarejestrowanymi we wstępnie skompilowanym pliku binarnym. W przypadku niezgodności zostanie wyświetlony komunikat o błędzie.

Po czwarte, moduł sprawdzający rozpoznaje niezdefiniowane symbole we wstępnie skompilowanym pliku binarnym. Te niezdefiniowane symbole muszą być zdefiniowane w jednej z zależności, a powiązanie symboli musi być GLOBAL lub WEAK . Jeżeli niezdefiniowany symbol nie może zostać rozpoznany, generowany jest komunikat o błędzie.

Wbudowane właściwości modułu

Zależności wstępnie skompilowanego pliku binarnego muszą być określone w jednej z następujących opcji:

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

Jeśli wstępnie skompilowany plik binarny ma zawierać pewne nierozpoznawalne, niezdefiniowane symbole , określ jedną z następujących opcji:

  • 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 następujących opcji:

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

Uruchom moduł sprawdzający

Narzędzie sprawdzające obejmuje wszystkie wstępnie zbudowane moduły ELF podczas procesu kompilacji systemu Android.

Aby uruchomić sam moduł sprawdzający w celu skrócenia czasu realizacji:

m check-elf-files

Naprawa błędów ABI

Automatyczna naprawa może pomóc w rozwiązaniu błędów sprawdzania ABI. Po prostu uruchom program naprawczy z plikiem wejściowym Android.bp / Android.mk, a program naprawczy wydrukuje sugerowaną poprawkę na standardowe wyjście. Opcjonalnie uruchom moduł naprawczy z opcją --in-place , aby bezpośrednio zaktualizować plik Android.bp / 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 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>