Narzędzie do definicji VNDK ułatwia dostawcom migrację drzewa źródłowego do Środowisko Androida 8.0. To narzędzie skanuje pliki binarne w systemie i systemie dostawcy i rozwiązuje zależności. Patrząc na wykres zależności modułów, można stwierdzić, może również wykrywać naruszenia koncepcji VNDK i dostarczać i sugestie dotyczące przenoszenia modułów między partycjami. W przypadku standardowego systemu Określono obraz (GSI), narzędzie do definicji VNDK może porównać system za pomocą GSI i określić rozszerzone biblioteki.
W tej sekcji omówiono trzy często używane polecenia definicji VNDK narzędzie:
vndk
Compute VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES i EXTRA_VENDOR_LIBRARIES na temat obejścia systemu kompilacji w Androidzie 8.0 i wyższe.check-dep
Sprawdź zależności modułu naruszającego zasady ze strony modułów dostawców do nieodpowiednich bibliotek udostępnionych platformy.deps
Wydrukuj zależności między bibliotekami udostępnionymi pliki wykonywalne.
Więcej informacji o korzystaniu z poleceń zaawansowanych znajdziesz tutaj: README.md w repozytorium narzędzia VNDK Definition.
Vndk
Podpolecenie vndk
wczytuje udostępnione biblioteki i pliki wykonywalne
z partycji systemu i partycji dostawcy, a potem rozwiązuje moduł
zależności określające biblioteki, do których należy skopiować
/system/lib[64]/vndk-sp-${VER}
i /vendor/lib[64]
.
Opcje polecenia podrzędnego vndk
obejmują:
Option | Opis |
---|---|
--system |
Wskaż katalog zawierający pliki znajdujące się w systemie partycji danych. |
--vendor |
Wskaż katalog zawierający pliki dostawcy partycji danych. |
--aosp-system |
Wskaż katalog zawierający pliki w katalogu obrazu systemu (GSI). |
--load-extra-deps |
Wskaż plik opisujący niejawne zależności, takie jak
dlopen() |
Aby na przykład obliczyć zbiory bibliotek VNDK, uruchom następujące polecenie
Polecenie podrzędne vndk
:
./vndk_definition_tool.py vndk \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--aosp-system ${ANDROID_PRODUCT_OUT}/../generic_arm64_ab/system\
--load-extra-deps dlopen.dep
Określ dodatkowe zależności w prostym formacie pliku. Każdy wiersz odpowiada , z pliku przed dwukropkiem w zależności od pliku po dwukropek. Na przykład:
/system/lib/libart.so: /system/lib/libart-compiler.so
Ten wiersz informuje narzędzie do definicji VNDK, że libart.so
zależy od: libart-compiler.so
.
Miejsce docelowe instalacji
Narzędzie do definicji VNDK zawiera listę bibliotek i odpowiadających im katalogów instalacyjnych dla tych kategorii:
Kategoria | Katalog |
---|---|
vndk_sp | Musisz zainstalować na urządzeniu /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Musisz zainstalować na urządzeniu /vendor/lib[64]/vndk-sp |
libs_dodatkowych_dostawców | Musisz zainstalować na urządzeniu /vendor/lib[64] |
Tworzenie szablonów systemowych
Po zebraniu danych wyjściowych z narzędzia do definicji VNDK dostawca może utworzyć
Android.mk
i wypełnij pole VNDK_SP_LIBRARIES
,
VNDK_SP_EXT_LIBRARIES
i EXTRA_VENDOR_LIBRARIES
do
zautomatyzować proces kopiowania bibliotek do wyznaczonej instalacji
miejsce docelowe.
ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),) VNDK_SP_LIBRARIES := ##_VNDK_SP_## VNDK_SP_EXT_LIBRARIES := ##_VNDK_SP_EXT_## EXTRA_VENDOR_LIBRARIES := ##_EXTRA_VENDOR_LIBS_## #------------------------------------------------------------------------------- # VNDK Modules #------------------------------------------------------------------------------- LOCAL_PATH := $(call my-dir) define define-vndk-lib include $$(CLEAR_VARS) LOCAL_MODULE := $1.$2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_PREBUILT_MODULE_FILE := $$(TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so LOCAL_STRIP_MODULE := false LOCAL_MULTILIB := first LOCAL_MODULE_TAGS := optional LOCAL_INSTALLED_MODULE_STEM := $1.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_RELATIVE_PATH := $3 LOCAL_VENDOR_MODULE := $4 include $$(BUILD_PREBUILT) ifneq ($$(TARGET_2ND_ARCH),) ifneq ($$(TARGET_TRANSLATE_2ND_ARCH),true) include $$(CLEAR_VARS) LOCAL_MODULE := $1.$2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_PREBUILT_MODULE_FILE := $$($$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so LOCAL_STRIP_MODULE := false LOCAL_MULTILIB := 32 LOCAL_MODULE_TAGS := optional LOCAL_INSTALLED_MODULE_STEM := $1.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_RELATIVE_PATH := $3 LOCAL_VENDOR_MODULE := $4 include $$(BUILD_PREBUILT) endif # TARGET_TRANSLATE_2ND_ARCH is not true endif # TARGET_2ND_ARCH is not empty endef $(foreach lib,$(VNDK_SP_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-sp-gen,vndk-sp,))) $(foreach lib,$(VNDK_SP_EXT_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-sp-ext-gen,vndk-sp,true))) $(foreach lib,$(EXTRA_VENDOR_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-ext-gen,,true))) #------------------------------------------------------------------------------- # Phony Package #------------------------------------------------------------------------------- include $(CLEAR_VARS) LOCAL_MODULE := $(YOUR_DEVICE_NAME)-vndk LOCAL_MODULE_TAGS := optional LOCAL_REQUIRED_MODULES := \ $(addsuffix .vndk-sp-gen,$(VNDK_SP_LIBRARIES)) \ $(addsuffix .vndk-sp-ext-gen,$(VNDK_SP_EXT_LIBRARIES)) \ $(addsuffix .vndk-ext-gen,$(EXTRA_VENDOR_LIBRARIES)) include $(BUILD_PHONY_PACKAGE) endif # ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)
kontrola ciszy
Polecenie podrzędne check-dep
skanuje moduły dostawców i sprawdza ich
zależności. Jeśli wykryje naruszenia, wyświetla element zależny od tego,
użycia bibliotek i symboli:
./vndk_definition_tool.py check-dep \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--tag-file eligible-list.csv \
--module-info ${ANDROID_PRODUCT_OUT}/module-info.json \
1> check_dep.txt \
2> check_dep_err.txt
Na przykład poniższe przykładowe dane wyjściowe pokazują naruszającą zależność z:
Od libRS_internal.so
do libmediandk.so
:
/system/lib/libRS_internal.so MODULE_PATH: frameworks/rs /system/lib/libmediandk.so AImageReader_acquireNextImage AImageReader_delete AImageReader_getWindow AImageReader_new AImageReader_setImageListener
Opcje polecenia podrzędnego check-dep
obejmują:
Option | Opis |
---|---|
--tag-file |
Musi odnosić się do odpowiedniego pliku tagów biblioteki (opisanego poniżej), który jest Arkusz kalkulacyjny udostępniony przez Google z opisem kategorii udostępnianych platform biblioteki. |
--module-info |
Wskazuje na module-info.json wygenerowane przez kompilację Androida
systemu. Pomaga narzędziu do definicji VNDK powiązać moduły binarne ze źródłem
w kodzie. |
Odpowiedni plik tagów biblioteki
Google udostępnia odpowiedni arkusz kalkulacyjny VNDK (np.
eligible-list.csv
), który taguje biblioteki udostępnione platformy, które
mogą być używane przez moduły dostawców:
Oznacz | Opis |
---|---|
LL-NDK | Biblioteki udostępnione ze stabilnymi interfejsami ABI/API, których mogą używać zarówno platformy i dostawców. |
LL-NDK – prywatne | Prywatne zależności bibliotek LL-NDK. Nie można uzyskać dostępu do modułów dostawcy bezpośrednio do tych bibliotek. |
VNDK-SP, | Zależności bibliotek udostępnionych platformy SP-HAL. |
VNDK-SP – prywatne | Zależności VNDK-SP, które nie są bezpośrednio dostępne dla wszystkich dostawców modułów. |
VNDK | Biblioteki udostępnione platformy, które są dostępne dla modułów dostawców (z wyjątkiem SP-HAL i SP-HAL-Dep). |
VNDK – prywatne | Zależności VNDK, które nie są bezpośrednio dostępne dla wszystkich dostawców modułów. |
TYLKO WERSJA FWK | Biblioteki udostępnione tylko dla platformy, do których dostawca nie może uzyskać dostępu (ani bezpośrednio, ani pośrednio). |
FWK-TYLKO-RS | Biblioteki udostępnione tylko dla platformy, do których dostawca nie może uzyskać dostępu (oprócz zastosowań RS). |
W tej tabeli opisano tagi używane w bibliotekach udostępnionych dostawcy:
Oznacz | Opis |
---|---|
SP-HAL | Biblioteki udostępnione w implementacji HAL w tym samym procesie. |
SP-HAL-Dep | Zależności SP-HAL bibliotek udostępnionych dostawcy (nazywane też zależnościami SP-HAL z wyłączeniem LL-NDK i VNDK-SP). |
TYLKO VND | Biblioteki udostępnione niewidoczne dla platformy, do których nie wolno uzyskiwać dostępu modułów platformy. Skopiowane rozszerzone biblioteki VNDK są oznaczone tagiem TYLKO VND. |
Relacje między tagami:
Rysunek 1. Relacje między tagami.
depsy
Aby debugować zależności biblioteki, polecenie podrzędne deps
wyświetla
zależności modułu:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Dane wyjściowe składają się z wielu wierszy. Wiersz bez znaku tabulatora powoduje rozpoczęcie nowej sekcji. Wiersz ze znakiem tabulatora zależy od poprzedzającego . Na przykład:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
Te dane wyjściowe wskazują, że zasada ld-android.so
nie ma zależności
i libc.so
zależą od wymiaru libdl.so
.
Podczas określania opcji --revert
deps
wyświetla informacje o korzystaniu z bibliotek (w dwóch wersjach
zależności):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Na przykład:
/system/lib/ld-android.so /system/lib/libdl.so
Te dane wyjściowe wskazują, że interfejs ld-android.so
jest używany przez
libdl.so
, czyli inaczej, libdl.so
zależy od
ld-android.so
Dodatkowo te dane wyjściowe pokazują,
libdl.so
jest jedynym użytkownikiem ld-android.so
.
Przy określaniu opcji --symbol
dyrektywa deps
wyświetla używane symbole:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Na przykład:
/system/lib/libc.so /system/lib/libdl.so android_get_application_target_sdk_version dl_unwind_find_exidx dlclose dlerror dlopen dlsym
Te dane wyjściowe pokazują, że funkcja libc.so
zależy od 6 wyeksportowanych funkcji
od libdl.so
. Jeśli zarówno opcja --symbol
, jak i
Podano opcję --revert
– symbole używane przez użytkownika
są drukowane.