Las bibliotecas compartidas de Android evolucionan periódicamente. Cómo mantener los objetos binarios compilados previamente y actualizarse requieren un gran esfuerzo. 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. El verificador puede detectar objetos binarios compilados previamente desactualizados en el tiempo de compilación, de modo que los desarrolladores de bibliotecas compartidas puedan saber qué aplicaciones binarios podrían dañarse debido a sus cambios y qué binarios precompilados se deben reconstruir.
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 primero binario y comprueba si todos los símbolos no definidos se resuelven.
Primero, el verificador comprueba la arquitectura de destino del objeto binario precompilado. Si el botón binario precompilado no tiene como objetivo ARM, AArch64, x86 o x86-64, el 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 el módulo
nombres a las variantes coincidentes (es decir, core
frente a vendor
) de la variante compartida
bibliotecas.
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 estos DT_SONAME
con 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 objeto 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 no definido 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 binario precompilado está diseñado para tener algunas funciones símbolos, 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 uno de los lo siguiente:
- 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 el verificador por sí solo y lograr 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 / Android.mk como entrada, y el reparador imprimiría el contenido sugerido
solucionar el problema a stdout. De manera opcional, ejecuta el corrector 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>