Narzędzie do definicji VNDK

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:

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.