As bibliotecas compartilhadas do Android evoluem de tempos em tempos. Manter os binários pré-criados atualizados exige um esforço considerável. No Android 9 ou versões anteriores, os binários pré-criados que dependem de bibliotecas ou ABIs removidas só falham na vinculação no momento da execução. Os desenvolvedores precisam rastrear os registros para encontrar os binários pré-criados desatualizados. No Android 10, foi introduzido um verificador de usos de ABI baseado em símbolos. O verificador pode detectar binários pré-criados desatualizados no tempo de compilação, para que os desenvolvedores de bibliotecas compartilhadas possam saber quais binários pré-criados podem ser corrompidos pelas mudanças que eles fazem e quais precisam ser recriados.
Verificador de usos de ABI baseado em símbolos
O verificador de usos de ABI baseado em símbolos emula o vinculador dinâmico do Android no host. O verificador vincula o binário pré-criado com as dependências do binário pré-criado e verifica se todos os símbolos indefinidos são resolvidos.
Primeiro, o verificador verifica a arquitetura de destino do binário pré-criado. Se o binário pré-criado não tiver como destino a arquitetura ARM, AArch64, x86 ou x86-64, o verificador pulará o binário pré-criado.
Em segundo lugar, as dependências do binário pré-criado precisam ser listadas em
LOCAL_SHARED_LIBRARIES
ou shared_libs
. O sistema de build
resolve os nomes dos módulos para a variante correspondente (ou seja,
core
em vez de 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 biblioteca
compartilhada e compara essas DT_SONAME
com as
entradas DT_NEEDED
registradas no binário pré-criado. Se houver uma
incompatibilidade, uma mensagem de erro será emitida.
Em quarto lugar, o verificador resolve os símbolos indefinidos no binário pré-criado.
Esses símbolos indefinidos precisam ser definidos em uma das dependências, e a
vinculação de símbolos precisa ser GLOBAL
ou WEAK
. Se um
símbolo indefinido não puder ser resolvido, uma mensagem de erro será emitida.
Propriedades de módulo pré-criadas
As dependências do binário pré-criado precisam ser especificadas em uma das seguintes opções:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Se o binário pré-criado for projetado para ter alguns símbolos indefinidos irresolú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 de arquivo ELF, especifique uma das seguintes opções:
- 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
como true
e execute
make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
Para ativar a verificação por padrão, adicione PRODUCT_CHECK_ELF_FILES
a BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
Os pré-builds são verificados automaticamente durante o processo de build do Android:
make