Narzędzie do definicji VNDK

Narzędzie do definiowania VNDK pomaga dostawcom przenieść drzewo źródłowe do środowiska Androida 8.0. To narzędzie skanuje pliki binarne w systemie i obrazach dostawcy, a następnie rozwiązuje zależności. Na podstawie wykresu zależności modułów narzędzie może też wykrywać naruszenia koncepcji VNDK i podawać informacje lub sugestie dotyczące przenoszenia modułów między partycjami. Jeśli określono ogólny obraz systemu (GSI), narzędzie do definiowania VNDK może porównać obraz systemu z GSI i określić rozszerzone biblioteki.

W tej sekcji omówimy 3 najczęściej używane polecenia narzędzia do definiowania VNDK:

  • vndk. Oblicz VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES i EXTRA_VENDOR_LIBRARIES na potrzeby obejścia systemu kompilacji w Androidzie 8.0 i nowszym.
  • check-dep. Sprawdź zależności naruszające zasady w modułach dostawców, które prowadzą do niekwalifikujących się zasobów wspólnych platformy.
  • deps. Drukuje zależności między bibliotekami współdzielonymi i plikami wykonywalnymi.

Więcej informacji o zaawansowanym użyciu poleceń znajdziesz w pliku README.md w repozytorium narzędzia VNDK Definition Tool.

vndk

Podpolecenie vndk wczytuje biblioteki współdzielone i pliki wykonywalne z partycji systemowej i partycji dostawcy, a następnie rozwiązuje zależności modułów, aby określić biblioteki, które muszą zostać skopiowane do /system/lib[64]/vndk-sp-${VER}/vendor/lib[64]. Opcje polecenia vndk:

Opcja Opis
--system Wskaż katalog zawierający pliki znajdujące się na partycji systemowej.
--vendor Wskaż katalog zawierający pliki znajdujące się w partycji dostawcy.
--aosp-system Wskaż katalog zawierający pliki znajdujące się w ogólnym obrazie systemu (GSI).
--load-extra-deps Wskaż plik, który opisuje zależności domniemane, np. dlopen().

Aby na przykład obliczyć zestawy bibliotek VNDK, uruchom to polecenie: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ę, w której plik przed dwukropkiem zależy od pliku po dwukropku. Na przykład:

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

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

Miejsce docelowe instalacji

Narzędzie do definiowania VNDK zawiera listę bibliotek i odpowiednich katalogów instalacyjnych w przypadku tych kategorii:

Kategoria Katalog
vndk_sp Musi być zainstalowana na urządzeniu /system/lib[64]/vndk-sp-${VER}
vndk_sp_ext Musi być zainstalowana na urządzeniu /vendor/lib[64]/vndk-sp
extra_vendor_libs Musi być zainstalowana na urządzeniu /vendor/lib[64]

Tworzenie szablonów systemowych

Po zebraniu danych wyjściowych z narzędzia do definiowania VNDK dostawca może utworzyć Android.mk i wypełnić pola VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIESEXTRA_VENDOR_LIBRARIES, aby zautomatyzować proces kopiowania bibliotek do wyznaczonego miejsca 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

Podpolecenie check-dep skanuje moduły dostawcy i sprawdza ich zależności. Jeśli wykryje naruszenia, wyświetli naruszające zasady zależności i użycia 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ższy przykładowy wynik pokazuje naruszającą zasady 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 polecenia check-dep:

Opcja Opis
--tag-file Musi odwoływać się do kwalifikującego się pliku tagu biblioteki (opisanego poniżej), który jest udostępnionym przez Google arkuszem kalkulacyjnym opisującym kategorie udostępnionych bibliotek platformy.
--module-info Wskazuje module-info.json wygenerowany przez system kompilacji Androida. Pomaga narzędziu do definiowania VNDK powiązać moduły binarne z kodem źródłowym.

Odpowiedni plik tagu biblioteki

Google udostępnia kwalifikujący się arkusz kalkulacyjny VNDK (np.eligible-list.csv), który zawiera tagi bibliotek współdzielonych frameworka, z których mogą korzystać moduły dostawcy:

Tag Opis
LL-NDK Biblioteki udostępnione ze stabilnymi interfejsami ABI/API, których mogą używać zarówno moduły platformy, jak i moduły dostawcy.
LL-NDK-Private Prywatne zależności bibliotek LL-NDK. Moduły dostawcy nie mogą uzyskiwać dostępu do tych bibliotek bezpośrednio.
VNDK-SP Zależności bibliotek udostępnionych platformy SP-HAL.
VNDK-SP-Private Zależności VNDK-SP, które nie są bezpośrednio dostępne dla wszystkich modułów dostawcy.
VNDK Biblioteki udostępniane w ramach platformy, które są dostępne dla modułów dostawcy (z wyjątkiem SP-HAL i SP-HAL-Dep).
VNDK-Private Zależności VNDK, które nie są bezpośrednio dostępne dla wszystkich modułów dostawcy.
FWK-ONLY Zasoby wspólne tylko w ramach platformy, do których moduły dostawcy nie mogą uzyskiwać dostępu (ani bezpośrednio, ani pośrednio).
FWK-ONLY-RS Biblioteki współdzielone tylko w ramach platformy, do których moduły dostawcy nie mogą mieć dostępu (z wyjątkiem użycia RS).

W tabeli poniżej opisujemy tagi używane w przypadku bibliotek udostępnionych dostawcom:

Tag Opis
SP-HAL Biblioteki udostępnione implementacji HAL w tym samym procesie.
SP-HAL-Dep Zależności bibliotek udostępnionych dostawcy SP-HAL (zwane też zależnościami SP-HAL z wyłączeniem LL-NDK i VNDK-SP).
TYLKO VND Biblioteki współużytkowane niewidoczne dla platformy, do których moduły platformy nie mogą uzyskiwać dostępu. Skopiowane rozszerzone biblioteki VNDK są również oznaczane jako VND-ONLY.

Relacje między tagami:

Relacje między tagami.

Rysunek 1. Relacje między tagami.

deps

Aby debugować zależności bibliotek, podpolecenie deps wyświetla zależności modułów:

./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 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

Z tego wynika, że ld-android.so nie ma zależności, a libc.so zależy od libdl.so.

Jeśli określisz opcję --revert, deps podpolecenie wyświetli 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
        

Z tego wynika, że ld-android.so jest używane przez libdl.so, czyli libdl.so zależy od ld-android.so. Dodatkowo ten wynik pokazuje, że libdl.so jest jedynym użytkownikiem ld-android.so.

Jeśli określisz opcję --symbol, podpolecenie deps wypisze 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

Dane wyjściowe pokazują, że funkcja libc.so zależy od 6 funkcji wyeksportowanych z libdl.so. Jeśli określono zarówno opcję --symbol, jak i --revert, drukowane są symbole używane przez użytkownika.