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>