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 un esfuerzo considerable. 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 correspondiente (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

El verificador cubre todos los módulos prediseñados de ELF durante el proceso de compilación de Android.

Para ejecutar el verificador solo y lograr tiempos de respuesta más rápidos:

m check-elf-files

Solucionador de errores ABI

El solucionador automático puede ayudar a resolver los errores de verificación de ABI. Simplemente ejecute el reparador con Android.bp/Android.mk como entrada, y el reparador imprimirá la solución sugerida en la salida estándar. Opcionalmente, ejecute el solucionador con la opción --in-place para actualizar directamente Android.bp/Android.mk con la solución 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>