Verificador de usos de ABI compilados previamente

Las bibliotecas compartidas de Android evolucionan de vez en cuando. Mantener actualizados los objetos binarios precompilados requiere un esfuerzo considerable. En Android 9 o versiones anteriores, los objetos binarios compilados previamente que dependen de las bibliotecas o ABI que se quitaron solamente no se pueden vincular en el entorno de ejecución. Los desarrolladores deben hacer un seguimiento de los registros para encontrar binarios compilados previamente. En Android 10, una ABI basada en símbolos el verificador de usos. En el momento de la compilación, el verificador puede detectar objetos binarios compilados previamente que son obsoletos para 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 componente binario y comprueba si todos los símbolos no definidos se resuelven.

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

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

Tercero, el verificador 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 estas DT_SONAME con las entradas DT_NEEDED registradas en el objeto binario precompilado. Si hay una discrepancia, se generará un error se emite este mensaje.

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

Propiedades de módulos compiladas previamente

Las dependencias del objeto binario precompilado se deben especificar en una de las siguientes opciones:

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

Si el objeto binario precompilado está diseñado para tener algunos símbolos no definidos que no se pueden resolver, especifica una de las siguientes opciones:

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

Para que el objeto binario precompilado 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 precompilados de ELF durante el proceso de compilación de Android.

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

m check-elf-files

Corrección de errores de ABI

El reparador automático puede ayudar a resolver errores de verificación de ABI. Simplemente, ejecuta el corrector con Android.bp o Android.mk como entrada, y el corrector imprimirá la corrección sugerida en el 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>

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>