Narzędzie definicji VNDK

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:

Relacje pomiędzy tagami.
Rysunek 1. 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.