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>