Design de snapshot do VNDK

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}.

Figura 1. Fazer upgrade somente do sistema

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:

Figura 2. Arquitetura de snapshots do VNDK

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 que 28 é 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.