Verificador de usos de ABI compilados previamente

Las bibliotecas compartidas de Android evolucionan con el tiempo. Mantener actualizados los archivos binarios prediseñados requiere un esfuerzo considerable. En Android 9 o versiones anteriores, los archivos binarios compilados previamente que dependen de bibliotecas o ABIs quitados solo fallan en la vinculación en el tiempo de ejecución. Los desarrolladores deben rastrear los registros para encontrar los objetos binarios prediseñados desactualizados. En Android 10, se introduce un verificador de usos de ABI basado en símbolos. El verificador puede detectar objetos binarios desarrollados previamente que son obsoletos en el momento de la compilación, de modo que los desarrolladores de bibliotecas compartidas puedan saber cuáles de ellos podrían estar dañados por los cambios y cuáles deben reconstruirse.

Verificador 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 objeto binario precompilado con las dependencias del objeto binario precompilado y verifica si se resolvieron todos los símbolos indefinidos.

Primero, el verificador comprueba la arquitectura de destino del binario compilado previamente. Si el objeto binario compilado previamente no está destinado a la arquitectura ARM, AArch64, x86 o x86-64, el verificador lo omite.

En segundo lugar, las dependencias del archivo binario compilado previamente deben aparecer 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 en comparación con vendor) de las bibliotecas compartidas.

En tercer lugar, el verificador compara las entradas de DT_NEEDED con LOCAL_SHARED_LIBRARIES o 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 objeto binario compilado previamente. Si hay una falta de coincidencia, se emitirá un mensaje de error.

En cuarto lugar, el verificador resuelve los símbolos no definidos en el objeto binario precompilado. Esos símbolos no definidos deben definirse en una de las dependencias, y la vinculación de símbolos debe ser GLOBAL o WEAK. Si no se puede resolver un símbolo indefinido, se emite un mensaje de error.

Propiedades del módulo de compilaciones previas

Las dependencias del binario compilado previamente deben especificarse en uno de los siguientes elementos:

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

Si el objeto binario compilado previamente está diseñado para tener algunos símbolos indefinidos no resolubles, especifica uno de los siguientes:

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

Para que el objeto binario prediseñado omita la verificación del archivo ELF, especifica una de las siguientes opciones:

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

Ejecuta el verificador

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

Para ejecutar el verificador por sí solo y obtener tiempos de respuesta más rápidos, haz lo siguiente:

m check-elf-files

Corrector de errores de ABI

El corrector automático puede ayudar a resolver errores de verificación de ABI. Solo tienes que ejecutar el corrector con Android.bp o Android.mk como entrada, y el corrector imprimirá la corrección sugerida en stdout. De manera opcional, ejecuta el corrector con la opción --in-place para actualizar directamente Android.bp o 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>

En el caso de 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>