Инструмент определения ВНДК

Инструмент определения 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 Definition Tool.

вндк

vndk загружает общие библиотеки и исполняемые файлы из системного раздела и разделов поставщиков, затем разрешает зависимости модулей, чтобы определить библиотеки, которые необходимо скопировать в /system/lib[64]/vndk-sp-${VER} и /vendor/lib[64] . /vendor/lib[64] . Опции подкоманды vndk включают:

Вариант Описание
--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 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 dep включают:

Вариант Описание
--tag-file Должен ссылаться на подходящий файл библиотечных тегов (описанный ниже), который представляет собой электронную таблицу, предоставленную Google, с описанием категорий общих библиотек фреймворка.
--module-info Указывает на module-info.json , сгенерированный системой сборки Android. Это помогает инструменту определения VNDK связать двоичные модули с исходным кодом.

Допустимый файл библиотечных тегов

Google предоставляет подходящую электронную таблицу VNDK (например eligible-list.csv ), которая помечает общие библиотеки фреймворка, которые могут использоваться модулями поставщика:

Ярлык Описание
ЛЛ-НДК Общие библиотеки со стабильными ABI/API, которые могут использоваться как модулями платформы, так и модулями поставщиков.
LL-NDK-Частный Частные зависимости библиотек LL-NDK. Модули производителя не должны обращаться к этим библиотекам напрямую.
ВНДК-СП Зависимости общих библиотек платформы SP-HAL.
ВНДК-СП-Приват Зависимости VNDK-SP, которые не доступны напрямую для всех модулей поставщика.
ВНДК Общие библиотеки Framework, доступные для модулей поставщиков (кроме SP-HAL и SP-HAL-Dep).
ВНДК-Приват Зависимости VNDK, которые не доступны напрямую для всех модулей поставщиков.
ТОЛЬКО FWK Общие библиотеки только для платформы, к которым не должны обращаться модули поставщиков (ни прямо, ни косвенно).
FWK-ONLY-RS Совместно используемые библиотеки только для платформы, к которым не должны обращаться модули поставщиков (за исключением использования RS).

В следующей таблице описаны теги, используемые для общих библиотек поставщиков:

Ярлык Описание
СП-ХАЛ Совместно используемые библиотеки реализации HAL для одного и того же процесса.
SP-HAL-Dep Зависимости общих библиотек поставщика SP-HAL (также известные как зависимости SP-HAL, за исключением LL-NDK и VNDK-SP).
ТОЛЬКО VND Невидимые для фреймворка общие библиотеки, к которым не должны обращаться модули фреймворка. Скопированные расширенные библиотеки VNDK также будут помечены как VND-ONLY.

Отношения между тегами:

Рисунок 1. Отношения между тегами.

депс

Для отладки зависимостей библиотеки подкоманда 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 зависит от 6 функций, экспортированных из libdl.so . Если указаны и параметр --symbol , и параметр --revert , будут напечатаны символы, используемые пользователем.