Comprobador de usos ABI preconstruido

Las bibliotecas compartidas de Android evolucionan de vez en cuando. Mantener actualizados los archivos binarios creados previamente requiere un esfuerzo considerable. En Android 9 o versiones anteriores, los archivos binarios precompilados que dependen de bibliotecas eliminadas o ABI solo fallan al vincularse en tiempo de ejecución. Los desarrolladores tienen que rastrear los registros para encontrar los binarios precompilados obsoletos. En Android 10, se presenta un verificador de usos de ABI basado en símbolos. El verificador puede detectar binarios preconstruidos desactualizados en el momento de la compilación, de modo que los desarrolladores de bibliotecas compartidas puedan saber qué binarios preconstruidos pueden romperse por su cambio y qué binarios preconstruidos deben reconstruirse.

Comprobador de usos de ABI basado en símbolos

El verificador de usos de ABI basado en símbolos emula el enlazador dinámico de Android en el host. El verificador vincula el binario preconstruido con las dependencias del binario preconstruido 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 tiene como destino 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 o shared_libs . El sistema de compilación resuelve los nombres de los módulos en la variante coincidente (es decir core frente a vendor ) de las bibliotecas compartidas.

En tercer lugar, el comprobador compara las entradas DT_NEEDED con LOCAL_SHARED_LIBRARIES o shared_libs . En particular, el verificador extrae la entrada DT_SONAME de cada biblioteca compartida y compara estos DT_SONAME con las entradas DT_NEEDED registradas en el binario precompilado. Si no coincide, se emite un mensaje de error.

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

Propiedades del módulo precompilado

Las dependencias del binario precompilado deben especificarse 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 preconstruido omita la verificación del archivo ELF, especifique uno de los siguientes:

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

Ejecutar el comprobador

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

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

m check-elf-files

Solucionador de errores ABI

El reparador 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 corrección sugerida en la salida estándar. Opcionalmente, ejecute el reparador con la opción --in --in-place para actualizar directamente Android.bp/Android.mk con la correcció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>