As bibliotecas compartilhadas do Android evoluem periodicamente. 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, um verificador de usos de ABI baseado em símbolos foi introduzido. O verificador pode detectar binários pré-criados desatualizados no momento da criaçã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 às dependências dele 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 destinado à arquitetura ARM, AArch64, x86 ou x86-64, o verificador vai 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 x vendor) das bibliotecas compartilhadas.
Em terceiro lugar, 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é-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 do módulo pré-criado
As dependências do binário pré-criado precisam 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é-criado foi projetado para ter alguns símbolos indefinidos não resolvíveis, especifique um dos seguintes:
- Android.bp:
allow_undefined_symbols: true, - Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Para que o binário pré-criado pule a verificação do arquivo ELF, especifique um dos seguintes:
- Android.bp:
check_elf_files: false, - Android.mk:
LOCAL_CHECK_ELF_FILES := false
Executar o verificador
O verificador abrange todos os módulos pré-criados do ELF durante o processo de build do Android.
Para executar o verificador sozinho e ter tempos de resposta mais rápidos:
m check-elf-filesCorretor de erros de ABI
O corretor automático pode ajudar a resolver erros de verificação de ABI. Basta executar o corretor com o Android.bp / Android.mk como entrada, e o corretor vai imprimir a correção sugerida para stdout. Opcionalmente, execute o corretor com a opção --in-place para atualizar diretamente o Android.bp / Android.mk com a correção sugerida.
Para Android.bp,
m fix_android_bp_prebuilt# Print the fixed Android.bp to stdout.fix_android_bp_prebuilt <path-to-Android.bp># Update the Android.bp in place.fix_android_bp_prebuilt --in-place <path-to-Android.bp>
Para Android.mk,
m fix_android_mk_prebuilt# Print the fixed Android.mk to stdout.fix_android_mk_prebuilt <path-to-Android.mk># Update the Android.mk in place.fix_android_mk_prebuilt --in-place <path-to-Android.mk>