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 um esforço considerável. No Android 9 ou anteriores, os binários pré-criados que dependem apenas de bibliotecas ou ABIs removidas não é possível fazer a vinculação durante a execução. Os desenvolvedores precisam rastrear os registros para encontrar binários pré-criados. No Android 10, uma ABI baseada em símbolos o verificador de usos é apresentado. O verificador detecta binários pré-criados desatualizados durante a compilação, para que os desenvolvedores de bibliotecas compartilhadas saibam quais bibliotecas os binários pré-criados podem ser corrompidos por essas alterações e quais devem ser ser reconstruída.

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 no host. O verificador vincula o binário pré-criado às dependências do 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 o binário pré-criado não é direcionado a arquiteturas ARM, AArch64, x86 ou x86-64, o 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 sistema de build resolve o módulo nomes à variante correspondente (ou seja, core x vendor) do bibliotecas.

Terceiro, o verificador compara as entradas DT_NEEDED com LOCAL_SHARED_LIBRARIES ou shared_libs. Mais especificamente, o verificador extrai a entrada DT_SONAME do cada biblioteca compartilhada e compara as DT_SONAME com as DT_NEEDED como entradas gravadas no binário pré-criado. Se houver incompatibilidade, um erro é emitida.

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

Propriedades do módulo pré-compilado

As dependências do binário pré-criado precisam ser especificadas de uma das seguintes maneiras:

  • 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 valores indefinidos e não resolvíveis símbolos, especifique um dos seguintes:

  • 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 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 de ELF durante o processo de build do Android.

Para executar apenas o verificador e obter tempos de resposta mais rápidos:

m check-elf-files

Correção de erros da ABI

O corretor automático pode ajudar a resolver erros de verificação da ABI. Basta executar o reparador Android.bp / Android.mk como entrada, e o fixador imprime o texto correção em stdout. Se quiser, execute o corrigido 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>