Narzędzie definicji VNDK

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Narzędzie definicji VNDK pomaga dostawcom w migracji ich 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ż wykrywać naruszenia koncepcji VNDK i dostarczać wgląd/sugestie dotyczące przenoszenia modułów między partycjami. Jeśli określono ogólny obraz systemu (GSI), narzędzie definicji 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 definicji VNDK:

  • vndk . Oblicz VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES i EXTRA_VENDOR_LIBRARIES w celu obejścia systemu kompilacji w systemie Android 8,0 i nowszych.
  • check-dep . Sprawdź zależności modułów naruszających od modułów dostawcy do nieuprawnionych bibliotek współdzielonych platformy.
  • deps . Wydrukuj zależności między bibliotekami współdzielonymi a plikami wykonywalnymi.

Więcej informacji na temat zaawansowanych poleceń można znaleźć w pliku README.md w repozytorium VNDK Definition Tool.

vndk

vndk ładuje współdzielone biblioteki i pliki wykonywalne z partycji systemowej i partycji dostawcy, a następnie rozwiązuje 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 dla 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, który opisuje niejawne zależności, takie jak dlopen() .

Na przykład, aby obliczyć zestawy bibliotek VNDK, uruchom następującą 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żdy wiersz reprezentuje relację, z plikiem przed dwukropkiem w zależności od pliku po dwukropku. Na przykład:

/system/lib/libart.so: /system/lib/libart-compiler.so

Ten wiersz informuje narzędzie definicji VNDK, że libart.so zależy od libart-compiler.so .

Miejsce docelowe instalacji

Narzędzie definicji 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
extra_vendor_libs Należy zainstalować w /vendor/lib[64]

Twórz szablony systemowe

Po zebraniu danych wyjściowych z narzędzia definicji VNDK dostawca może utworzyć plik Android.mk i wypełnić VNDK_SP_LIBRARIES , VNDK_SP_EXT_LIBRARIES i EXTRA_VENDOR_LIBRARIES w celu zautomatyzowania procesu 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)),)

check-dep

check-dep skanuje moduły dostawców i sprawdza ich zależności. Jeśli wykryje naruszenia, drukuje naruszającą bibliotekę zależną i użycie 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 następujące przykładowe dane wyjściowe pokazują naruszającą zależność 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 check-dep obejmują:

Opcja Opis
--tag-file Musi odnosić się do odpowiedniego pliku tagów biblioteki (opisanego poniżej), który jest dostarczonym przez Google arkuszem kalkulacyjnym opisującym kategorie bibliotek współdzielonych platformy.
--module-info Wskazuje na module-info.json wygenerowany przez system kompilacji Androida. Pomaga narzędziu definicji VNDK powiązać moduły binarne z kodem źródłowym.

Kwalifikujący się plik znaczników biblioteki

Google udostępnia odpowiedni arkusz kalkulacyjny VNDK (np eligible-list.csv ), który taguje biblioteki współdzielone platformy, z których mogą korzystać moduły dostawców:

Etykietka Opis
LL-NDK Biblioteki współdzielone ze stabilnymi interfejsami ABI/API, z których mogą korzystać zarówno moduły platformy, jak i dostawcy.
LL-NDK-Prywatne Prywatne zależności bibliotek LL-NDK. Moduły dostawcy nie mogą uzyskiwać bezpośredniego dostępu do tych bibliotek.
VNDK-SP Zależności bibliotek współdzielonych platformy SP-HAL.
VNDK-SP-Prywatne Zależności VNDK-SP, które nie są bezpośrednio dostępne dla wszystkich modułów dostawców.
VNDK Biblioteki współdzielone 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 modułów dostawców.
TYLKO FWK Biblioteki współdzielone tylko dla platformy, do których nie mogą uzyskać dostępu moduły dostawcy (ani bezpośrednio, ani pośrednio).
FWK-TYLKO-RS Biblioteki współdzielone tylko dla platformy, do których nie mogą uzyskać dostępu moduły dostawców (z wyjątkiem zastosowań RS).

W poniższej tabeli opisano tagi używane w bibliotekach współdzielonych dostawców:

Etykietka Opis
SP-HAL Biblioteki współdzielone implementacji warstwy 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 platformy, do których nie mogą uzyskać dostępu moduły platformy. Skopiowane rozszerzone biblioteki VNDK zostaną również oznaczone jako VND-ONLY.

Relacje między tagami:

Rysunek 1. Relacje między tagami.

deps

Aby debugować zależności biblioteki, 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. Linia bez znaku tabulacji rozpoczyna nową sekcję. Linia ze znakiem tabulacji zależy od poprzedniej sekcji. Na przykład:

/system/lib/ld-android.so
/system/lib/libc.so
        /system/lib/libdl.so

Te dane wyjściowe pokazują, że ld-android.so nie ma zależności, a libc.so zależy od libdl.so .

Podczas określania opcji --revert deps wyświetla użycie 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
        

Te dane wyjściowe pokazują, że ld-android.so jest używany przez libdl.so , lub innymi słowy, libdl.so zależy od ld-android.so . Ponadto dane wyjściowe pokazują, że libdl.so jest jedynym użytkownikiem ld-android.so .

Podczas określania opcji --symbol 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 określono zarówno opcję --symbol , jak i opcję --revert , zostaną wydrukowane symbole używane przez użytkownika.