Os snapshots do VNDK podem ser usados por uma imagem do sistema para fornecer as bibliotecas VNDK corretas para as imagens do fornecedor, mesmo quando as imagens do sistema e do fornecedor são criadas com base em versões diferentes do Android. A criação de um snapshot do VNDK exige a captura de bibliotecas do VNDK como um snapshot e a marcação delas com um número de versão. A imagem do fornecedor pode ser vinculada a uma versão específica do VNDK que fornece ABIs necessárias para os módulos na imagem do fornecedor. No entanto, na mesma versão do VNDK, as bibliotecas do VNDK precisam ser ABI-estáveis.
O design de snapshots do VNDK inclui métodos para gerar os pré-builds de um snapshot do VNDK a partir da imagem do sistema atual e instalar essas bibliotecas pré-criadas na partição do sistema de uma versão mais recente do Android.
Sobre as bibliotecas do VNDK
As HALs HIDL, introduzidas no Android 8.0, permitem upgrades separados para partições do sistema e do fornecedor. O VNDK define conjuntos de bibliotecas (VNDK-core, VNDK-SP e LL-NDK) com que o código do fornecedor pode se vincular e impede que os fornecedores usem bibliotecas que não estão em um conjunto do VNDK. Como resultado, a imagem do fornecedor pode ser criada e executada se os conjuntos de VNDK adequados na imagem do sistema forem fornecidos à imagem do fornecedor.
VNDK-core
O conjunto de bibliotecas do VNDK-core é instalado em
/system/lib[64]/vndk-${VER}
e está disponível
somente para processos do fornecedor com o nível da API igual a
${VER}
. Os processos do sistema não podem usar essas bibliotecas e precisam
usar as bibliotecas instaladas em /system/lib[64]
. Devido
à restrição estrita do namespace para cada processo, as bibliotecas do núcleo do VNDK
estão protegidas contra carregamento duplo.
Para incluir uma biblioteca no VNDK-core, adicione o seguinte ao
Android.bp
:
vendor_available: true, vndk: { enabled: true, },
VNDK-SP
As bibliotecas do VNDK-SP são instaladas em /system/lib[64]/vndk-sp-${VER}
e ficam disponíveis para processos do fornecedor e do sistema (por meio das bibliotecas
SP-HAL instaladas na partição do fornecedor). As bibliotecas do VNDK-SP podem ser
carregadas duas vezes.
Para incluir uma biblioteca no VNDK-SP, adicione o seguinte ao Android.bp
:
vendor_available: true, vndk: { enabled: true, support_system_process: true, },
LL-NDK
As bibliotecas LL-NDK são instaladas em /system/lib[64]
. Os módulos do fornecedor
podem usar bibliotecas stub do LL-NDK para acessar símbolos pré-selecionados de bibliotecas
do LL-NDK. As bibliotecas LL-NDK precisam ser compatíveis com versões anteriores e estáveis em ABI para
permitir que versões mais antigas de módulos de fornecedores usem novas versões de bibliotecas LL-NDK.
Devido às características estáveis de ABI do LL-NDK, o snapshot do VNDK
não precisa incluir bibliotecas LL-NDK para imagens de fornecedores antigas.
Sobre os snapshots do VNDK
O Android 8.1 incluiu bibliotecas do VNDK criadas a partir do código-fonte. No entanto, para versões mais recentes do Android, cada versão do VNDK precisa ser capturada como um instantâneo e fornecida como um pré-build para permitir o link para uma imagem de fornecedor mais antiga.
A partir do Android 9, as novas versões do Android vão
incluir pelo menos um instantâneo dos diretórios VNDK-core e VNDK-SP para versões
mais antigas no código-fonte do Android. No momento do build, os instantâneos necessários serão
instalados em /system/lib[64]/vndk-${VER}
e
/system/lib[64]/vndk-sp-${VER}
(diretórios que podem ser usados pela
partição do fornecedor), em que ${VER}
é a variável de string que
representa o nome da versão do snapshot do VNDK.
Como as bibliotecas de snapshot do VNDK podem ser diferentes para cada versão do VNDK, o snapshot
do VNDK também inclui as configurações de namespace do vinculador, instaladas como
etc/ld.config.${VER}.txt
,
/etc/llndk.libraries.${VER}.txt
e
/etc/vndksp.libraries.${VER}.txt
.
Exemplo: fazer upgrade de imagens do sistema e do fornecedor
Nenhum snapshot é necessário. Crie sem configurações adicionais para snapshots do VNDK.
Exemplo: fazer upgrade apenas da imagem do sistema
É necessário incluir o snapshot do VNDK e os arquivos de configuração do namespace do linker para
a imagem do fornecedor na imagem do sistema. Os arquivos de configuração do namespace do vinculador
são configurados automaticamente para procurar bibliotecas do VNDK em
/system/lib[64]/vndk-${VER}
e
/system/lib[64]/vndk-sp-${VER}
.

Exemplo: upgrade da imagem do sistema, mudança de imagem do fornecedor
A criação de uma imagem do fornecedor com base em um snapshot do VNDK ainda não é possível. Portanto, você precisa criar a imagem do fornecedor separadamente com o código-fonte original e fazer upgrade da imagem do sistema, conforme descrito no exemplo anterior.
Arquitetura de snapshots do VNDK
Para tornar uma imagem do sistema Android 9 compatível com uma imagem do fornecedor do Android 8.1, o snapshot do VNDK que corresponde à imagem do fornecedor do Android 8.1 precisa ser fornecido com a imagem do sistema Android 9, conforme mostrado abaixo:

O design de snapshot do VNDK inclui os seguintes métodos:
- Gerar um snapshot para as bibliotecas VNDK-core e
VNDK-SP. O Android 9 inclui um script que
pode ser usado para fazer um snapshot do build atual do VNDK. Esse script agrupa todas
as bibliotecas em
/system/lib[64]/vndk-28
e/system/lib[64]/vndk-sp-28
que foram criadas com a fonte atual como um snapshot do VNDK, em que28
é a versão do VNDK do Android 9. O snapshot também inclui os arquivos de configuração do namespace do linker/etc/ld.config.28.txt
,/etc/llndk.libraries.28.txt
e/etc/vndksp.libraries.28.txt
. O snapshot gerado será usado com versões mais recentes do Android (mais recentes que o Android 9). - Instalação de bibliotecas pré-criadas do VNDK-core e do VNDK-SP usando um
snapshot. No Android 9, um snapshot do VNDK tem
um conjunto de bibliotecas pré-criadas do VNDK-core e um conjunto de bibliotecas do VNDK-SP, além
de arquivos de configuração do namespace do linker. Quando você fornece uma lista de versões de snapshot
do VNDK a serem instaladas, no momento do build, a imagem do sistema instala
as bibliotecas de snapshot do VNDK em
/system/lib[64]/vndk-${VER}
e os diretórios/system/lib[64]/vndk-sp-${VER}
e os arquivos de configuração de namespace do linker para esses snapshots do VNDK no diretório/etc
.
Controle de versões do VNDK
Cada versão do Android tem apenas um snapshot do VNDK, e a versão do SDK é usada como
uma versão do VNDK, o que significa que a versão do VNDK tem um número inteiro, como 27
para o Android 8.1. A versão do VNDK é corrigida quando a versão do Android é
lançada. A versão do VNDK usada pela partição do fornecedor é armazenada
automaticamente na propriedade ro.vndk.version
, que pode ser lida
no ambiente de execução. Essa versão é usada para identificar a versão do VNDK do fornecedor
para algumas bibliotecas e identificar a versão do snapshot do VNDK para a configuração
do namespace.
Criar bibliotecas do VNDK
O comando make vndk
cria bibliotecas que têm vndk:
{ enabled: true, … }
, incluindo dependências e arquivos de configuração
de namespace. Se BOARD_VNDK_VERSION := current
estiver definido,
essas bibliotecas serão criadas com o comando make
.
Como esse build não instala as bibliotecas do VNDK do snapshot, as bibliotecas instaladas do VNDK não são estáveis para ABI. No entanto, quando uma versão do Android é lançada, a ABI da versão atual do VNDK é corrigida. Nesse ponto, qualquer violação de ABI é um erro de build. Portanto, os patches na versão do Android não podem mudar a ABI para as bibliotecas do VNDK.