Design de instantâneo do VNDK

Os snapshots 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 versões diferentes do Android. A criação de um snapshot do VNDK requer 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, dentro da mesma versão do VNDK, as bibliotecas do VNDK devem ser estáveis ​​em termos de ABI .

O design do snapshot VNDK inclui métodos para gerar pré-builds de um snapshot VNDK a partir da imagem atual do sistema e instalar essas bibliotecas pré-construídas na partição do sistema de uma versão mais recente do Android.

Sobre bibliotecas VNDK

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

Núcleo VNDK

O conjunto principal de bibliotecas do VNDK é 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, em vez disso, usar as bibliotecas instaladas em /system/lib[64] . Devido à restrição estrita de namespace para cada processo, as bibliotecas principais 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 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 ter carregamento duplo.

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 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 snapshot do VNDK não precisa incluir bibliotecas LL-NDK para imagens de fornecedores antigos.

Sobre instantâneos do VNDK

O Android 8.1 incluía bibliotecas VNDK construídas 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é-construção para permitir 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 snapshots 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), onde ${VER} é a variável de string que representa o nome da versão do snapshot do VNDK.

Como as bibliotecas de snapshots 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: Atualizando imagens do sistema e do fornecedor

Nenhum instantâneo é necessário; build sem configurações adicionais para snapshots do VNDK.

Exemplo: Atualizando apenas a imagem do sistema

Deve incluir o snapshot 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 procurar bibliotecas VNDK em /system/lib[64]/vndk-${VER} e /system/lib[64]/vndk-sp-${VER} .

Figura 1. Somente atualização do sistema

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

Ainda não há suporte para a criação de uma imagem do fornecedor em um snapshot do VNDK; 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 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 deve ser fornecido com a imagem do sistema Android 9, conforme mostrado abaixo:

Figura 2. Arquitetura de snapshot do VNDK

O design do snapshot VNDK inclui os seguintes métodos:

  • Gerando um snapshot para bibliotecas VNDK-core e VNDK-SP . O Android 9 inclui um script que você pode usar para criar um snapshot 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 criadas com a fonte atual como um snapshot VNDK, onde 28 é a versão VNDK do 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 (acima do Android 9).
  • Instalação de bibliotecas VNDK-core e VNDK-SP pré-construídas a partir de um snapshot . No Android 9, um snapshot do VNDK tem um conjunto de bibliotecas de núcleo VNDK pré-construídas 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 snapshots do VNDK a serem instaladas, no momento da compilação, a imagem do sistema instala as bibliotecas de snapshots do VNDK em /system/lib[64]/vndk-${VER} e em /system/lib[64]/vndk-sp-${VER} Diretórios /system/lib[64]/vndk-sp-${VER} e arquivos de configuração de namespace do vinculador para esses snapshots do VNDK para o diretório /etc .

Controle de versão 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 VNDK é corrigida quando a versão 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 é então usada para identificar a versão do VNDK do fornecedor para algumas bibliotecas e para identificar a versão do snapshot do VNDK para configuração de namespace.

Construindo 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 construídas com o comando make .

Como esta compilação não instala as bibliotecas VNDK do snapshot, as bibliotecas VNDK instaladas não são estáveis ​​em ABI. 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 Android não devem alterar a ABI para bibliotecas VNDK.