Namespaces para bibliotecas nativas

O Android 7.0 introduziu namespaces para bibliotecas nativas para limitar a visibilidade interna da API e resolver situações em que os aplicativos usam acidentalmente bibliotecas de plataforma em vez de suas próprias. Consulte a postagem do blog Melhorando a estabilidade com restrições de símbolos C/C++ privados no Android 7.0 Android Developers para obter alterações específicas do aplicativo.

Arquitetura

No Android 7.0 e superior, as bibliotecas do sistema são separadas das bibliotecas de aplicativos.

Namespaces para bibliotecas nativas

Figura 1. Namespaces para bibliotecas nativas

Namespaces para bibliotecas nativas impedem que aplicativos usem APIs nativas de plataforma privada (como foi feito com OpenSSL). Ele também remove situações em que os aplicativos usam acidentalmente bibliotecas de plataforma em vez de suas próprias (como testemunhado com libpng ). É difícil para as bibliotecas de aplicativos usarem as bibliotecas internas do sistema por acidente (e vice-versa).

Adicionando bibliotecas nativas adicionais

Além das bibliotecas nativas públicas padrão, os fornecedores de silício (a partir do Android 7.0) e os fabricantes de dispositivos (a partir do Android 9) podem optar por fornecer bibliotecas nativas adicionais acessíveis aos aplicativos, colocando-as nas respectivas pastas da biblioteca e listando-as explicitamente em .txt arquivos.

As pastas da biblioteca são:

  • /vendor/lib (para 32 bits) e /vendor/lib64 (para 64 bits) para bibliotecas de fornecedores de silício
  • /system/lib (para 32 bits) e /system/lib64 (para 64 bits) para bibliotecas de fabricantes de dispositivos

Os arquivos .txt são:

  • /vendor/etc/public.libraries.txt para bibliotecas de fornecedores de silício
  • /system/etc/public.libraries-COMPANYNAME.txt para bibliotecas de fabricantes de dispositivos, onde COMPANYNAME se refere a um nome do fabricante (como awesome.company ). COMPANYNAME deve corresponder a [A-Za-z0-9_.-]+ ; caracteres alfanuméricos, _, . (ponto) e -. É possível ter vários desses arquivos .txt em um dispositivo se algumas bibliotecas forem de provedores de soluções externos.

Bibliotecas nativas na partição do system que são tornadas públicas pelos fabricantes de dispositivos DEVEM ser denominadas lib*COMPANYNAME.so , por exemplo, libFoo.awesome.company.so . Em outras palavras, libFoo.so sem o sufixo do nome da empresa NÃO DEVE ser tornado público. O COMPANYNAME no nome do arquivo da biblioteca DEVE corresponder ao COMPANYNAME no nome do arquivo txt no qual o nome da biblioteca está listado.

Bibliotecas nativas que fazem parte do AOSP NÃO DEVEM ser tornadas públicas (exceto as bibliotecas nativas públicas padrão que são públicas por padrão). Apenas as bibliotecas adicionais adicionadas por fornecedores de silício ou fabricantes de dispositivos podem ser disponibilizadas para aplicativos.

A partir do Android 8.0, as bibliotecas públicas de fornecedores têm as seguintes restrições adicionais e configurações necessárias:

  1. A biblioteca nativa no fornecedor deve ser rotulada corretamente para que possa ser acessada pelos aplicativos. Se o acesso for exigido por qualquer aplicativo (incluindo aplicativos de terceiros), a biblioteca deve ser rotulada como same_process_hal_file em um arquivo file_contexts específico do fornecedor da seguinte forma:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    em que libnative.so é o nome da biblioteca nativa.
  2. A biblioteca, direta ou transitivamente por meio de suas dependências, não deve depender de bibliotecas do sistema que não sejam bibliotecas VNDK-SP e LLNDK. Localize a lista de bibliotecas VNDK-SP e LLNDK em development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv .

Atualizando aplicativos para não usar bibliotecas nativas não públicas

Esse recurso está habilitado apenas para aplicativos direcionados ao SDK versão 24 ou posterior; para compatibilidade com versões anteriores, consulte a Tabela 1. O que esperar se seu aplicativo estiver vinculado a bibliotecas nativas privadas . A lista de bibliotecas nativas do Android acessíveis a aplicativos (também conhecidas como bibliotecas nativas públicas) está listada na seção 3.1.1 do CDD. Os aplicativos direcionados a 24 anos ou mais e que usam bibliotecas não públicas devem ser atualizados. Consulte NDK Apps Linking to Platform Libraries para obter mais detalhes.

Atualizando aplicativos para suas dependências de biblioteca nativas

Os aplicativos direcionados ao SDK versão 31 (Android 12) ou superior devem especificar explicitamente suas dependências de biblioteca compartilhada nativa usando a tag <uses-native-library> no manifesto do aplicativo. Se alguma parte da biblioteca solicitada não existir no dispositivo, o aplicativo não está instalado. Quando os aplicativos são instalados, eles recebem apenas as bibliotecas compartilhadas nativas que solicitaram. Isso significa que os aplicativos não podem acessar bibliotecas compartilhadas nativas que não aparecem no manifesto do aplicativo.