Design de instantâneo do VNDK

Os instantâneos do VNDK podem ser usados ​​por uma imagem do sistema para fornecer as bibliotecas VNDK corretas às imagens do fornecedor, mesmo quando as imagens do sistema e do fornecedor são criadas a partir de diferentes versões do Android. A criação de um instantâneo do VNDK requer a captura de bibliotecas do VNDK como um instantâneo e a marcação com um número de versão. A imagem do fornecedor pode ser vinculada a uma versão específica do VNDK que fornece as ABIs necessárias para os módulos na imagem do fornecedor. No entanto, na mesma versão do VNDK, as bibliotecas do VNDK devem ser ABI-stable .

O design de instantâneo do VNDK inclui métodos para gerar as pré-compilações de um instantâneo do VNDK a partir da imagem atual do sistema e instalar essas bibliotecas pré-compiladas na partição do sistema de uma versão mais recente do Android.

Sobre as bibliotecas VNDK

HIDL-HALs , introduzido no Android 8.0, permite atualizações separadas para partições do sistema e do fornecedor. O VNDK define conjuntos de bibliotecas (VNDK-core, VNDK-SP e LL-NDK) que o código do fornecedor pode vincular e bloqueia os fornecedores de usar bibliotecas que não estão em um conjunto VNDK. Como resultado, a imagem do fornecedor pode ser criada e executada se os conjuntos VNDK adequados na imagem do sistema forem fornecidos à imagem do fornecedor.

Núcleo VNDK

O conjunto de bibliotecas VNDK-core está instalado em /system/lib[64]/vndk-${VER} e está disponível apenas para processos de fornecedores com nível de API igual a ${VER} . Os processos do sistema não podem usar essas bibliotecas e devem usar as bibliotecas instaladas em /system/lib[64] . Devido à restrição estrita de namespace para cada processo, as bibliotecas do núcleo VNDK estão protegidas contra carregamento duplo.

Para incluir uma biblioteca no VNDK-core, adicione o seguinte a Android.bp :

vendor_available: true,
vndk: {
    enabled: true,
},

VNDK-SP

As bibliotecas VNDK-SP são instaladas em /system/lib[64]/vndk-sp-${VER} e estão disponíveis para processos do fornecedor e processos do sistema (por meio das bibliotecas SP-HAL instaladas na partição do fornecedor). As bibliotecas VNDK-SP podem ser carregadas duplamente.

Para incluir uma biblioteca no VNDK-SP, adicione o seguinte a 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] . Módulos de fornecedores podem usar bibliotecas stub LL-NDK para acessar símbolos pré-selecionados de bibliotecas LL-NDK. As bibliotecas LL-NDK devem ser compatíveis com versões anteriores e estáveis ​​em ABI para permitir que versões 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 instantâneo do VNDK não precisa incluir bibliotecas LL-NDK para imagens de fornecedores antigos.

Sobre instantâneos do VNDK

O Android 8.1 incluiu bibliotecas VNDK criadas a partir do código-fonte . No entanto, para versões posteriores do Android, cada versão do VNDK deve ser capturada como um instantâneo e fornecida como uma pré-compilação para habilitar a vinculação a uma imagem de fornecedor mais antiga.

A partir do Android 9, as novas versões do Android incluirão 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 da compilação, 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 ​​pelo fornecedor partição), em que ${VER} é a variável de string que representa o nome da versão do instantâneo do VNDK.

Como as bibliotecas de instantâneos do VNDK podem ser diferentes para cada versão do VNDK, o instantâneo 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: atualização de imagens do sistema e do fornecedor

Nenhum instantâneo necessário; compilar sem configurações adicionais para instantâneos do VNDK.

Exemplo: Atualizando apenas a imagem do sistema

Deve incluir o instantâneo do VNDK e os arquivos de configuração do namespace do vinculador para a imagem do fornecedor na imagem do sistema. Os arquivos de configuração do namespace do vinculador são configurados automaticamente para pesquisar bibliotecas VNDK em /system/lib[64]/vndk-${VER} e /system/lib[64]/vndk-sp-${VER} .

Figura 1. Atualizando apenas o sistema

Exemplo: atualização da imagem do sistema, pequena alteração na imagem do fornecedor

A criação de uma imagem do fornecedor em relação a um instantâneo do VNDK ainda não é compatível, portanto, você deve criar a imagem do fornecedor separadamente com seu código-fonte original e, em seguida, atualizar a imagem do sistema conforme descrito no exemplo anterior.

Arquitetura de instantâneo do VNDK

Para tornar uma imagem do sistema Android 9 compatível com uma imagem de fornecedor do Android 8.1, o instantâneo do VNDK que corresponde à imagem do fornecedor do Android 8.1 deve ser fornecido com a imagem do sistema Android 9, conforme mostrado abaixo:

Figura 2. Arquitetura de instantâneo do VNDK

O design de instantâneo do VNDK inclui os seguintes métodos:

  • Gerando um instantâneo para bibliotecas VNDK-core e VNDK-SP . O Android 9 inclui um script que você pode usar para fazer um instantâneo da versão atual do VNDK. Este script agrupa todas as bibliotecas em /system/lib[64]/vndk-28 e /system/lib[64]/vndk-sp-28 que foram compiladas com a fonte atual como um instantâneo do VNDK, em que 28 é a versão do VNDK de Android 9. O instantâneo também inclui os arquivos de configuração do namespace do vinculador /etc/ld.config.28.txt , /etc/llndk.libraries.28.txt e /etc/vndksp.libraries.28.txt . O instantâneo gerado será usado com versões mais recentes do Android (superiores ao Android 9).
  • Instalando bibliotecas VNDK-core e VNDK-SP pré-criadas a partir de um snapshot . No Android 9, um snapshot do VNDK tem um conjunto de bibliotecas VNDK-core pré-criadas e um conjunto de bibliotecas VNDK-SP, bem como arquivos de configuração de namespace do vinculador. Quando você fornece uma lista de versões de instantâneos do VNDK a serem instaladas, no momento da compilação, a imagem do sistema instala as bibliotecas de instantâneos do VNDK em /system/lib[64]/vndk-${VER} e /system/lib[64]/vndk-sp-${VER} e arquivos de configuração de namespace do vinculador para esses instantâneos do VNDK para o diretório /etc .

Versão 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 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 em tempo 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 instantâneo do VNDK para configuração de namespace.

Como criar bibliotecas VNDK

O comando make vndk cria bibliotecas que possuem 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 essa compilação não instala as bibliotecas VNDK do instantâneo, as bibliotecas VNDK instaladas não são ABI-estáveis. No entanto, quando uma versão do Android é lançada, a ABI da versão atual do VNDK é corrigida. Neste ponto, qualquer quebra de ABI é um erro de compilação, portanto, os patches para a versão do Android não devem alterar a ABI para bibliotecas VNDK.