As bibliotecas compartilhadas do Android evoluem de tempos em tempos. Manter os binários pré-construídos atualizados requer esforços consideráveis. No Android 9 ou anterior, os binários pré-construídos que dependem de bibliotecas ou ABIs removidas só falham na vinculação em tempo de execução. Os desenvolvedores precisam rastrear os logs para encontrar os binários pré-construídos desatualizados. No Android 10, é introduzido um verificador de uso de ABI baseado em símbolos. O verificador pode detectar binários pré-construídos desatualizados no momento da construção, para que os desenvolvedores de bibliotecas compartilhadas possam saber quais binários pré-construídos podem ser quebrados por sua alteração e quais binários pré-construídos devem ser reconstruídos.
Verificador de uso de ABI baseado em símbolos
O verificador de usos da ABI baseado em símbolos emula o vinculador dinâmico do Android no host. O verificador vincula o binário pré-construído às dependências do binário pré-construído e verifica se todos os símbolos indefinidos foram resolvidos.
Primeiro, o verificador verifica a arquitetura alvo do binário pré-construído. Se o binário pré-construído não for direcionado à arquitetura ARM, AArch64, x86 ou x86-64, o verificador ignorará o binário pré-construído.
Segundo, as dependências do binário pré-construído devem ser listadas em LOCAL_SHARED_LIBRARIES
ou shared_libs
. O sistema de compilação resolve os nomes dos módulos para a variante correspondente (ou seja, core
vs vendor
) das bibliotecas compartilhadas.
Terceiro, o verificador compara as entradas DT_NEEDED
com LOCAL_SHARED_LIBRARIES
ou shared_libs
. Em particular, o verificador extrai a entrada DT_SONAME
de cada biblioteca compartilhada e compara esses DT_SONAME
com as entradas DT_NEEDED
registradas no binário pré-construído. Se houver incompatibilidade, uma mensagem de erro será emitida.
Quarto, o verificador resolve os símbolos indefinidos no binário pré-construído. Esses símbolos indefinidos devem ser definidos em uma das dependências e a ligação do 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é-construído
As dependências do binário pré-construído devem ser especificadas em um dos seguintes:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Se o binário pré-construído for projetado para ter alguns símbolos indefinidos não resolvidos , especifique um dos seguintes:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Para que o binário pré-construído ignore a verificação do arquivo ELF, especifique um dos seguintes:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Execute 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 habilitar o verificador por padrão, adicione PRODUCT_CHECK_ELF_FILES
a BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
Os pré-construídos são verificados automaticamente durante o processo de compilação do Android:
make