Verificador de usos de ABI pré-criada

As bibliotecas compartilhadas do Android evoluem de tempos em tempos. Como manter binários pré-criados e atualizados exige esforços consideráveis. No Android 9 ou anteriores, os binários pré-criados que dependem Bibliotecas ou ABIs removidas só não são vinculadas no ambiente de execução. Os desenvolvedores precisam rastrear os registros para encontrar os binários pré-criados desatualizados. No Android 10, é apresentado um verificador de usos de ABI baseado em símbolos. O verificador pode detectar binários pré-criados desatualizados no momento da criação, de modo que os arquivos os desenvolvedores de bibliotecas podem saber quais binários pré-criados podem ser corrompidos pelos alterações e quais binários pré-criados precisam ser recriados.

Verificador de usos de ABI baseada em símbolos

O verificador de usos de ABI baseado em símbolos emula o vinculador dinâmico do Android nos host. O verificador vincula o binário pré-criado às dependências do binário pré-criado e verifica se todos os símbolos indefinidos foram resolvidos.

Primeiro, o verificador verifica a arquitetura de destino do binário pré-criado. Se o binário pré-criado não for direcionado a ARM, AArch64, x86 ou x86-64 do servidor, o verificador ignora o binário pré-criado.

Segundo, as dependências do binário pré-criado precisam ser listadas LOCAL_SHARED_LIBRARIES ou shared_libs. O build do módulo resolve os nomes dos módulos para a variante correspondente (por exemplo, core vs. vendor) das bibliotecas compartilhadas.

Terceiro, o verificador compara as entradas DT_NEEDED com LOCAL_SHARED_LIBRARIES ou shared_libs. Especificamente, o verificador extrai a entrada DT_SONAME de cada entrada bibliotecas e compara essas DT_SONAME com as Entradas DT_NEEDED gravadas no binário pré-criado. Se houver um erro será emitido.

Em quarto lugar, o verificador resolve os símbolos indefinidos no binário pré-criado. Esses símbolos indefinidos devem ser definidos em uma das dependências e no a vinculação de símbolo deve ser GLOBAL ou WEAK. Se um símbolo indefinido não puder ser resolvido, uma mensagem de erro será emitida.

Propriedades do módulo pré-compilado

As dependências do binário pré-criado precisam ser especificadas em um dos seguinte:

  • Android.bp: shared_libs: ["libc", "libdl", "libm"],
  • Android.mk: LOCAL_SHARED_LIBRARIES := libc libdl libm

Se o binário pré-criado tiver alguns símbolos indefinidos inresolvíveis, especifique uma das seguintes opções:

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Para que o binário pré-criado ignore a verificação do arquivo ELF, especifique um dos seguinte:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

Executar o verificador

Para executar o verificador, defina a variável de ambiente CHECK_ELF_FILES para true e executar make check-elf-files:

CHECK_ELF_FILES=true make check-elf-files

Para ativar o verificador por padrão, adicione PRODUCT_CHECK_ELF_FILES para BoardConfig.mk:

PRODUCT_CHECK_ELF_FILES := true

As versões pré-criadas são verificadas automaticamente durante o processo de build do Android:

make