A ferramenta de definição VNDK ajuda os fornecedores a migrar sua árvore de origem para um ambiente Android 8.0. Essa ferramenta verifica os arquivos binários no sistema e as imagens do fornecedor e, em seguida, resolve as dependências. Com base no gráfico de dependência do módulo, a ferramenta também pode detectar violações aos conceitos do VNDK e fornecer insights/sugestões para mover módulos entre partições. Se uma imagem genérica do sistema (GSI) for especificada, a ferramenta de definição do VNDK poderá comparar a imagem do sistema com a GSI e determinar as bibliotecas estendidas.
Esta seção abrange três comandos usados com frequência para a ferramenta de definição do VNDK:
-
vndk
. Calcule VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES e EXTRA_VENDOR_LIBRARIES para solução alternativa do sistema de compilação no Android 8.0 e superior. -
check-dep
. Verifique as dependências do módulo violador de módulos de fornecedor para bibliotecas compartilhadas de estrutura não qualificadas. -
deps
. Imprima as dependências entre as bibliotecas compartilhadas e os executáveis.
Para obter mais detalhes sobre o uso de comandos avançados, consulte o arquivo README.md no repositório da VNDK Definition Tool.
vndk
O subcomando vndk
carrega as bibliotecas compartilhadas e executáveis da partição do sistema e das partições do fornecedor e, em seguida, resolve as dependências do módulo para determinar as bibliotecas que devem ser copiadas para /system/lib[64]/vndk-sp-${VER}
e /vendor/lib[64]
. As opções para o subcomando vndk
incluem:
Opção | Descrição |
---|---|
--system | Aponte para um diretório contendo os arquivos que residirão na partição do sistema. |
--vendor | Aponte para um diretório contendo os arquivos que residirão em uma partição de fornecedor. |
--aosp-system | Aponte para um diretório que contém os arquivos que residirão na imagem de sistema genérica (GSI). |
--load-extra-deps | Aponte para um arquivo que descreve as dependências implícitas, como dlopen() . |
Por exemplo, para calcular os conjuntos de bibliotecas VNDK, execute o seguinte subcomando 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
Especifique dependências extras com um formato de arquivo simples. Cada linha representa um relacionamento, com o arquivo antes dos dois pontos dependendo do arquivo após os dois pontos. Por exemplo:
/system/lib/libart.so: /system/lib/libart-compiler.so
Essa linha permite que a ferramenta de definição do VNDK saiba que libart.so
depende de libart-compiler.so
.
Destino de instalação
A ferramenta de definição do VNDK lista as bibliotecas e os diretórios de instalação correspondentes para as seguintes categorias:
Categoria | Diretório |
---|---|
vndk_sp | Deve instalar em /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Deve instalar em /vendor/lib[64]/vndk-sp |
extra_vendor_libs | Deve instalar em /vendor/lib[64] |
Construir modelos de sistema
Depois de reunir as saídas da ferramenta de definição do VNDK, um fornecedor pode criar um Android.mk
e preencher VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
e EXTRA_VENDOR_LIBRARIES
para automatizar o processo de cópia de bibliotecas para o destino de instalação designado.
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
O subcomando check-dep
verifica os módulos do fornecedor e verifica suas dependências. Se detectar violações, ele imprime a biblioteca dependente violadora e os usos de símbolos:
./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
Por exemplo, a saída de amostra a seguir mostra uma dependência violadora de libRS_internal.so
para 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
As opções para o subcomando check-dep
incluem:
Opção | Descrição |
---|---|
--tag-file | Deve referir-se a um arquivo de tag de biblioteca qualificado (descrito abaixo), que é uma planilha fornecida pelo Google que descreve categorias de bibliotecas compartilhadas de estrutura. |
--module-info | Aponta para o module-info.json gerado pelo sistema de compilação do Android. Ele ajuda a ferramenta de definição do VNDK a associar módulos binários ao código-fonte. |
Arquivo de tag de biblioteca qualificado
O Google fornece uma planilha VNDK qualificada (por exemplo eligible-list.csv
) que marca as bibliotecas compartilhadas do framework que podem ser usadas pelos módulos do fornecedor:
Marcação | Descrição |
---|---|
LL-NDK | Bibliotecas compartilhadas com ABIs/APIs estáveis que podem ser usadas tanto pela estrutura quanto pelos módulos do fornecedor. |
LL-NDK-Privado | Dependências privadas de bibliotecas LL-NDK. Os módulos do fornecedor não devem acessar essas bibliotecas diretamente. |
VNDK-SP | Dependências de bibliotecas compartilhadas da estrutura SP-HAL. |
VNDK-SP-Privado | Dependências do VNDK-SP que não são diretamente acessíveis a todos os módulos do fornecedor. |
VNDK | Bibliotecas compartilhadas de estrutura que estão disponíveis para módulos de fornecedores (exceto SP-HAL e SP-HAL-Dep). |
VNDK-Privado | Dependências do VNDK que não são diretamente acessíveis a todos os módulos do fornecedor. |
SOMENTE FWK | Bibliotecas compartilhadas somente do framework que não devem ser acessadas pelos módulos do fornecedor (nem direta nem indiretamente). |
FWK-SOMENTE-RS | Bibliotecas compartilhadas somente do framework que não devem ser acessadas pelos módulos do fornecedor (exceto para usos do RS). |
A tabela a seguir descreve as tags usadas para bibliotecas compartilhadas do fornecedor:
Marcação | Descrição |
---|---|
SP-HAL | Bibliotecas compartilhadas de implementação de HAL de mesmo processo. |
SP-HAL-Dep | Dependências de bibliotecas compartilhadas do fornecedor SP-HAL (também conhecidas como dependências SP-HAL, excluindo LL-NDK e VNDK-SP). |
SOMENTE VND | Bibliotecas compartilhadas invisíveis do framework que não devem ser acessadas pelos módulos do framework. As bibliotecas VNDK estendidas copiadas também serão marcadas como VND-ONLY. |
Relações entre tags:
![](https://source.android.google.cn/devices/architecture/images/treble_vndk_design.png?authuser=4&hl=pt-br)
dependências
Para depurar as dependências da biblioteca, o subcomando deps
imprime as dependências do módulo:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
A saída consiste em várias linhas. A linha sem um caractere de tabulação inicia uma nova seção. A linha com um caractere de tabulação depende da seção anterior. Por exemplo:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
Esta saída mostra que ld-android.so
não tem uma dependência e libc.so
depende de libdl.so
.
Ao especificar a opção --revert
, o subcomando deps
imprime os usos das bibliotecas (dependências invertidas):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Por exemplo:
/system/lib/ld-android.so /system/lib/libdl.so
Esta saída mostra que ld-android.so
é usado por libdl.so
, ou em outras palavras, libdl.so
depende de ld-android.so
. Além disso, essa saída mostra que libdl.so
é o único usuário de ld-android.so
.
Ao especificar a opção --symbol
, o subcomando deps
imprime os símbolos que estão sendo usados:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Por exemplo:
/system/lib/libc.so /system/lib/libdl.so android_get_application_target_sdk_version dl_unwind_find_exidx dlclose dlerror dlopen dlsym
Esta saída mostra que libc.so
depende de 6 funções exportadas de libdl.so
. Se ambas as opções --symbol
e --revert
forem especificadas, os símbolos usados pelo usuário serão impressos.