Comprobador de usos de ABI prediseñado

Las bibliotecas compartidas de Android evolucionan de vez en cuando. Mantener actualizados los archivos binarios prediseñados requiere esfuerzos considerables. En Android 9 o versiones anteriores, los archivos binarios prediseñados que dependen de bibliotecas o ABI eliminadas solo no se vinculan en tiempo de ejecución. Los desarrolladores tienen que rastrear los registros para encontrar los archivos binarios prediseñados obsoletos. En Android 10, se introduce un verificador de usos de ABI basado en símbolos. El verificador puede detectar archivos binarios prediseñados obsoletos en el momento de la compilación, de modo que los desarrolladores de bibliotecas compartidas puedan saber qué archivos binarios prediseñados podrían verse dañados por su cambio y cuáles deben reconstruirse.

Comprobador de usos de ABI basado en símbolos

El verificador de usos de ABI basado en símbolos emula el vinculador dinámico de Android en el host. El verificador vincula el binario precompilado con las dependencias del binario precompilado y verifica si todos los símbolos no definidos están resueltos.

Primero, el verificador verifica la arquitectura de destino del binario precompilado. Si el binario precompilado no está destinado a la arquitectura ARM, AArch64, x86 o x86-64, el verificador omite el binario precompilado.

En segundo lugar, las dependencias del binario precompilado deben enumerarse en LOCAL_SHARED_LIBRARIES shared_libs . El sistema de compilación resuelve los nombres de los módulos en la variante coincidente (es decir, core versus vendor ) de las bibliotecas compartidas.

En tercer lugar, el verificador compara las entradas DT_NEEDED con LOCAL_SHARED_LIBRARIES shared_libs . En particular, el verificador extrae la entrada DT_SONAME de cada biblioteca compartida y compara estas DT_SONAME con las entradas DT_NEEDED registradas en el binario prediseñado. Si hay una discrepancia, se emite un mensaje de error.

Cuarto, el verificador resuelve los símbolos indefinidos en el binario prediseñado. Esos símbolos indefinidos deben definirse en una de las dependencias y el enlace del símbolo debe ser GLOBAL o WEAK . Si un símbolo indefinido no se puede resolver, se emite un mensaje de error.

Propiedades del módulo precompilado

Las dependencias del binario precompilado se deben especificar en uno de los siguientes:

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

Si el binario precompilado está diseñado para tener algunos símbolos indefinidos que no se pueden resolver , especifique uno de los siguientes:

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

Para que el binario precompilado omita la verificación del archivo ELF, especifique una de las siguientes opciones:

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

Ejecute el verificador

Para ejecutar el verificador, establezca la variable de entorno CHECK_ELF_FILES en true y ejecute make check-elf-files :

CHECK_ELF_FILES=true make check-elf-files

Para habilitar el verificador de forma predeterminada, agregue PRODUCT_CHECK_ELF_FILES a BoardConfig.mk :

PRODUCT_CHECK_ELF_FILES := true

Las precompilaciones se verifican automáticamente durante el proceso de compilación de Android:

make