Narzędzie do definiowania VNDK pomaga dostawcom w migracji drzewa źródłowego do środowiska Android 8.0. To narzędzie skanuje pliki binarne w systemie i obrazy dostawców, a następnie rozwiązuje zależności. Na podstawie wykresu zależności modułów narzędzie może również wykryć naruszenia koncepcji VNDK i zapewnić wgląd/sugestie dotyczące przenoszenia modułów pomiędzy partycjami. Jeśli określono ogólny obraz systemu (GSI), narzędzie definiujące VNDK może porównać obraz systemu z GSI i określić rozszerzone biblioteki.
W tej sekcji omówiono trzy często używane polecenia narzędzia definiującego VNDK:
-
vndk
. Oblicz VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES i EXTRA_VENDOR_LIBRARIES, aby obejść system kompilacji w systemie Android 8.0 i nowszych. -
check-dep
. Sprawdź naruszające zależności modułów od modułów dostawcy do niekwalifikujących się bibliotek współdzielonych platformy. -
deps
. Wydrukuj zależności między bibliotekami współdzielonymi a plikami wykonywalnymi.
Więcej szczegółów na temat zaawansowanego użycia poleceń można znaleźć w pliku README.md w repozytorium VNDK Definition Tool.
vndk
Komenda vndk
ładuje biblioteki współużytkowane i pliki wykonywalne z partycji systemowej i partycji dostawcy, a następnie sprawdza zależności modułów w celu określenia bibliotek, które należy skopiować do /system/lib[64]/vndk-sp-${VER}
i /vendor/lib[64]
. Opcje komendy vndk
obejmują:
Opcja | Opis |
---|---|
--system | Wskaż katalog zawierający pliki, które będą znajdować się na partycji systemowej. |
--vendor | Wskaż katalog zawierający pliki, które będą znajdować się na partycji dostawcy. |
--aosp-system | Wskaż katalog zawierający pliki, które będą znajdować się w ogólnym obrazie systemu (GSI). |
--load-extra-deps | Wskaż plik opisujący ukryte zależności, taki jak dlopen() . |
Na przykład, aby obliczyć zestawy bibliotek VNDK, uruchom następującą komendę 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 za pomocą prostego formatu pliku. Każda linia reprezentuje relację, przy czym plik przed dwukropkiem zależy od pliku znajdującego się po dwukropku. Na przykład:
/system/lib/libart.so: /system/lib/libart-compiler.so
Ta linia informuje narzędzie definiujące VNDK, że libart.so
zależy od libart-compiler.so
.
Miejsce docelowe instalacji
Narzędzie do definiowania VNDK wyświetla listę bibliotek i odpowiednich katalogów instalacyjnych dla następujących kategorii:
Kategoria | Informator |
---|---|
vndk_sp | Należy zainstalować w /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Należy zainstalować w /vendor/lib[64]/vndk-sp |
dodatkowe_dostawcy_libs | Należy zainstalować w /vendor/lib[64] |
Twórz szablony systemowe
Po zebraniu danych wyjściowych z narzędzia definiującego VNDK sprzedawca może utworzyć plik Android.mk
i wypełnić VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
i EXTRA_VENDOR_LIBRARIES
, aby zautomatyzować proces kopiowania bibliotek do wyznaczonego miejsca docelowego instalacji.
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)),)
dział kontroli
Podkomenda check-dep
skanuje moduły dostawcy i sprawdza ich zależności. Jeśli wykryje naruszenia, wypisuje zależną bibliotekę i użycie symboli, które naruszają:
./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ść między libRS_internal.so
a 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 komendy check-dep
obejmują:
Opcja | Opis |
---|---|
--tag-file | Musi odnosić się do kwalifikującego się pliku tagu biblioteki (opisanego poniżej), czyli arkusza kalkulacyjnego udostępnionego przez Google, który opisuje kategorie współdzielonych bibliotek frameworku. |
--module-info | Wskazuje module-info.json wygenerowany przez system kompilacji Androida. Pomaga narzędziu definiującemu VNDK powiązać moduły binarne z kodem źródłowym. |
Odpowiedni plik znacznika biblioteki
Google udostępnia odpowiedni arkusz kalkulacyjny VNDK (np. eligible-list.csv
), który oznacza biblioteki współdzielone platformy, z których mogą korzystać moduły dostawców:
Etykietka | Opis |
---|---|
LL-NDK | Współdzielone biblioteki ze stabilnymi interfejsami ABI/API, z których mogą korzystać zarówno platformy, jak i moduły dostawców. |
LL-NDK-prywatny | Zależności prywatne bibliotek LL-NDK. Moduły dostawcy nie mogą uzyskiwać bezpośredniego dostępu do tych bibliotek. |
VNDK-SP | Zależności bibliotek współdzielonych frameworku SP-HAL. |
VNDK-SP-prywatny | Zależności VNDK-SP, które nie są bezpośrednio dostępne dla wszystkich modułów dostawców. |
VNDK | Biblioteki współdzielone Framework dostępne dla modułów dostawców (z wyjątkiem SP-HAL i SP-HAL-Dep). |
VNDK-prywatny | Zależności VNDK, które nie są bezpośrednio dostępne dla wszystkich modułów dostawcy. |
TYLKO FWK | Biblioteki współdzielone przeznaczone wyłącznie dla platformy, do których moduły dostawcy nie mogą uzyskać dostępu (ani bezpośrednio, ani pośrednio). |
FWK-TYLKO-RS | Biblioteki współdzielone przeznaczone wyłącznie dla platformy, do których moduły dostawców nie mogą uzyskać dostępu (z wyjątkiem zastosowań RS). |
Poniższa tabela opisuje znaczniki używane w bibliotekach współdzielonych dostawców:
Etykietka | Opis |
---|---|
SP-HAL | Biblioteki współdzielone implementacji HAL tego samego procesu. |
SP-HAL-Dep | Zależności bibliotek współdzielonych dostawcy SP-HAL (inaczej zależności SP-HAL z wyłączeniem LL-NDK i VNDK-SP). |
TYLKO VND | Biblioteki współdzielone niewidoczne dla frameworka, do których moduły frameworku nie mogą uzyskać dostępu. Skopiowane rozszerzone biblioteki VNDK również zostaną oznaczone jako VND-ONLY. |
Relacje pomiędzy tagami:
dep
Aby zdebugować zależności bibliotek, podkomenda 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 linii. Linia bez znaku tabulacji rozpoczyna nową sekcję. Wiersz ze znakiem tabulacji zależy od poprzedniej sekcji. Na przykład:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
To wyjście pokazuje, że ld-android.so
nie ma zależności, a libc.so
zależy od libdl.so
.
Po podaniu opcji --revert
komenda deps
wypisuje informacje o użyciu bibliotek (odwrócone 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
To wyjście pokazuje, że ld-android.so
jest używane przez libdl.so
, czyli innymi słowy, libdl.so
zależy od ld-android.so
. Ponadto te dane wyjściowe pokazują, że libdl.so
jest jedynym użytkownikiem ld-android.so
.
Po podaniu opcji --symbol
komenda 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
To wyjście pokazuje, że libc.so
zależy od 6 funkcji wyeksportowanych z libdl.so
. Jeśli podano zarówno opcję --symbol
, jak i opcję --revert
, wydrukowane zostaną symbole używane przez użytkownika.