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 precompilados que dependen de bibliotecas o ABIs quitadas solo no se vinculan durante el tiempo de ejecución. Los desarrolladores deben hacer un seguimiento de los registros para encontrar los objetos binarios precompilados obsoletos. En Android 10, se incluye un verificador de usos de ABI basado en símbolos. En el momento de la compilación, el verificador puede detectar objetos binarios precompilados 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 binario precompilado con las dependencias del mismo y verifica si se resuelven todos los símbolos no definidos.
Primero, el verificador comprueba la arquitectura de destino del binario precompilado. Si el objeto binario precompilado no se orienta a la arquitectura ARM, AArch64, x86 o x86-64, el verificador omite el objeto binario precompilado.
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 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 binario precompilado. Si hay una discrepancia, se emite un mensaje de error.
En cuarto lugar, el verificador resuelve los símbolos no definidos en el 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 no definido, se emite un mensaje de error.
Propiedades de los módulos precompilados
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 irresolubles, 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
Para ejecutar el verificador, establece la variable de entorno CHECK_ELF_FILES
en true
y ejecuta make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
Para habilitar el verificador de forma predeterminada, agrega PRODUCT_CHECK_ELF_FILES
a BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
Las compilaciones precompiladas se verifican automáticamente durante el proceso de compilación de Android:
make