Инструмент определения VNDK помогает поставщикам перенести дерево исходного кода в среду Android 8.0. Этот инструмент сканирует двоичные файлы в системных и сторонних образах, а затем разрешает зависимости. На основе графа зависимостей модулей инструмент также может обнаруживать нарушения концепций VNDK и предоставлять информацию и рекомендации по перемещению модулей между разделами. Если указан общий образ системы (GSI), инструмент определения VNDK может сравнить ваш образ системы с GSI и определить расширенные библиотеки.
В этом разделе описаны три часто используемые команды для инструмента определения VNDK:
vndk. Вычисляются значения VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES и EXTRA_VENDOR_LIBRARIES для обхода проблем в системе сборки Android 8.0 и более поздних версий.check-dep. Проверьте зависимости модулей поставщика от недопустимых общих библиотек фреймворка.deps. Вывести зависимости между общими библиотеками и исполняемыми файлами.
Подробную информацию о том, как использовать расширенные команды, можно найти в файле README.md в репозитории инструмента определения VNDK.
VNDK
Подкоманда vndk загружает общие библиотеки и исполняемые файлы из системного раздела и раздела поставщика, а затем разрешает зависимости модулей, чтобы определить, какие библиотеки необходимо скопировать в /system/lib[64]/vndk-sp-${VER} и /vendor/lib[64].
Для подкоманды vndk доступны следующие параметры:
| Option | Описание |
|---|---|
--system |
Укажите каталог, содержащий файлы, которые находятся в системном разделе. |
--vendor |
Укажите каталог, содержащий файлы, которые находятся в разделе поставщика. |
--aosp-system |
Укажите каталог, содержащий файлы, которые находятся в общем образе системы (GSI). |
--load-extra-deps |
Укажите файл, в котором описаны неявные зависимости, например dlopen(). |
Например, чтобы вычислить наборы библиотек VNDK, выполните следующую подкоманду 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Указывать дополнительные зависимости в простом формате файла. Каждая строка представляет собой связь, при этом файл до двоеточия зависит от файла после двоеточия. Пример:
/system/lib/libart.so: /system/lib/libart-compiler.so
Эта строка сообщает инструменту определения VNDK, что libart.so зависит от libart-compiler.so.
Целевой каталог установки
Инструмент определения VNDK перечисляет библиотеки и соответствующие каталоги установки для следующих категорий:
| Категория | Каталог |
|---|---|
| vndk_sp | Установить в /system/lib[64]/vndk-sp-${VER} |
| vndk_sp_ext | Установите на устройство "/vendor/lib[64]/vndk-sp" |
| extra_vendor_libs | Установить в /vendor/lib[64] |
Как создавать системные шаблоны
После того как инструмент определения VNDK соберет выходные данные, поставщик может создать файл Android.mk и заполнить поля VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES и EXTRA_VENDOR_LIBRARIES, чтобы автоматизировать процесс копирования библиотек в указанное место установки.
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 сканирует модули поставщиков и проверяет их зависимости. Если нарушения обнаружены, будут выведены названия библиотек и символов, которые нарушают правила:
./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Например, в приведенном ниже образце выходных данных показана зависимость с нарушением от libRS_internal.so к 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
Для подкоманды check-dep доступны следующие варианты:
| Option | Описание |
|---|---|
--tag-file |
Должен ссылаться на подходящий файл тега библиотеки (описан ниже), который представляет собой предоставленную Google таблицу с описанием категорий общих библиотек фреймворка. |
--module-info |
Указывает на module-info.json, созданный системой сборки Android. Он помогает инструменту определения VNDK связывать двоичные модули с исходным кодом. |
Файл тега библиотеки, отвечающий требованиям
Google предоставляет таблицу VNDK (например, eligible-list.csv), в которой отмечены общие библиотеки фреймворка, которые могут использоваться модулями поставщика:
| Тег | Описание |
|---|---|
| LL-NDK | Общие библиотеки со стабильными ABI/API, которые могут использоваться как модулями фреймворка, так и модулями поставщика. |
| LL-NDK-Private | Частные зависимости библиотек LL-NDK. Модули поставщиков не должны иметь прямого доступа к этим библиотекам. |
| VNDK-SP | Зависимости общих библиотек фреймворка SP-HAL. |
| VNDK-SP-Private | Зависимости VNDK-SP, которые недоступны напрямую для всех модулей поставщика. |
| VNDK | Общие библиотеки фреймворка, доступные для модулей поставщика (кроме SP-HAL и SP-HAL-Dep). |
| VNDK-Private | Зависимости VNDK, которые недоступны напрямую для всех модулей поставщика. |
| FWK-ONLY | Общие библиотеки, доступ к которым запрещен для модулей поставщика (как прямой, так и косвенный). |
| FWK-ONLY-RS | Общие библиотеки, доступ к которым не должен предоставляться модулям поставщика (кроме использования RS). |
В таблице ниже описаны теги, используемые для общих библиотек поставщиков.
| Тег | Описание |
|---|---|
| SP-HAL | Общие библиотеки для реализации HAL в том же процессе. |
| SP-HAL-Dep | Зависимости общих библиотек поставщика SP-HAL (также называемые зависимостями SP-HAL), за исключением LL-NDK и VNDK-SP. |
| ТОЛЬКО ДЛЯ ВЬЕТНАМСКИХ ДОНГОВ | Невидимые для фреймворка общие библиотеки, к которым не должны обращаться модули фреймворка. Скопированные расширенные библиотеки VNDK также помечаются как VND-ONLY. |
Связи между тегами:
Рисунок 1. Взаимосвязи между тегами.
deps
Чтобы отладить зависимости библиотеки, подкоманда deps выводит зависимости модуля:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendorРезультат состоит из нескольких строк. Строка без символа табуляции начинает новый раздел. Строка с символом табуляции зависит от предыдущего раздела. Пример:
/system/lib/ld-android.so
/system/lib/libc.so
/system/lib/libdl.soИз этого вывода следует, что у ld-android.so нет зависимостей, а libc.so зависит от libdl.so.
Если указать параметр --revert, подкоманда deps выведет использование библиотек (обратные зависимости):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendorПример:
/system/lib/ld-android.so
/system/lib/libdl.so
В этом примере ld-android.so используется в libdl.so, то есть libdl.so зависит от ld-android.so. Кроме того, из этих данных видно, что libdl.so – единственный пользователь ld-android.so.
Если указан параметр --symbol, подкоманда deps выводит используемые символы:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Пример:
/system/lib/libc.so
/system/lib/libdl.so
android_get_application_target_sdk_version
dl_unwind_find_exidx
dlclose
dlerror
dlopen
dlsymИз этого вывода следует, что libc.so зависит от шести функций, экспортированных из libdl.so. Если указаны оба варианта (--symbol и --revert), будут напечатаны символы, которые использовал пользователь.