Ferramenta de definição VNDK

A ferramenta de definição do VNDK ajuda os fornecedores a migrar sua árvore de origem para um ambiente Android 8.0. Esta ferramenta verifica arquivos binários no sistema e imagens do fornecedor e, em seguida, resolve dependências. Com base no gráfico de dependência do módulo, a ferramenta também pode detectar violações dos 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 aborda 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ções alternativas de sistema de compilação no Android 8.0 e versões posteriores.
  • check-dep . Verifique as dependências do módulo violado dos módulos do 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 avançado de comandos, consulte o arquivo README.md no repositório da VNDK Definition Tool.

vndk

O subcomando vndk carrega as bibliotecas compartilhadas e os 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 que contém os arquivos que residirão na partição do sistema.
--vendor Aponte para um diretório que contém os arquivos que residirão em uma partição do fornecedor.
--aosp-system Aponte para um diretório que contém os arquivos que residirão na imagem genérica do sistema (GSI).
--load-extra-deps Aponte para um arquivo que descreva 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

Esta 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 VNDK lista bibliotecas e diretórios de instalação correspondentes para as seguintes categorias:

Categoria Diretório
vndk_sp Deve ser instalado em /system/lib[64]/vndk-sp-${VER}
vndk_sp_ext Deve ser instalado em /vendor/lib[64]/vndk-sp
extra_vendor_libs Deve ser instalado em /vendor/lib[64]

Crie modelos de sistema

Depois de coletar os resultados da ferramenta de definição 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)),)

verificação-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 da violação 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, o exemplo de saída a seguir mostra uma dependência violada 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 É necessário consultar 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 module-info.json gerado pelo sistema de compilação Android. Ajuda a ferramenta de definição 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 da estrutura 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 da estrutura que estão disponíveis para módulos do fornecedor (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 de estrutura que não devem ser acessadas por módulos do fornecedor (nem direta nem indiretamente).
FWK-SOMENTE-RS Bibliotecas compartilhadas somente de estrutura que não devem ser acessadas por módulos do fornecedor (exceto para usos de 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 HAL do 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 na estrutura que não devem ser acessadas pelos módulos da estrutura. As bibliotecas VNDK estendidas copiadas também serão marcadas como VND-ONLY.

Relações entre tags:

Relacionamentos entre tags.
Figura 1. Relacionamentos entre tags.

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 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 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, esta 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 as opções --symbol e --revert forem especificadas, os símbolos usados ​​pelo usuário serão impressos.