Las bibliotecas compartidas de Android evolucionan periódicamente. Cómo mantener los objetos binarios compilados previamente y actualizarse requiere esfuerzos considerables. En Android 9 o versiones anteriores, los objetos binarios compilados previamente que dependen de las bibliotecas o ABI quitadas no se pueden vincular en el tiempo de ejecución. Los desarrolladores tienen que hacer un seguimiento de los registros para encontrar los objetos binarios compilados previamente y desactualizados. En Android 10, se presenta un verificador de usos de ABI basado en símbolos. El comprobador puede detectar binarios compilados previamente y desactualizados al momento de la compilación, de modo que los los desarrolladores de bibliotecas pueden saber cuáles son los objetos binarios compilados previamente que pueden estar dañados cambiar y qué objetos binarios compilados previamente deben volver a compilarse.
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 host. El verificador vincula el binario precompilado con las dependencias del binario precompilado 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 objeto binario precompilado no tiene como destino ARM, AArch64, x86 o x86-64 de código abierto, el verificador omite el objeto binario precompilado.
En segundo lugar, las dependencias del binario precompilado deben enumerarse en
LOCAL_SHARED_LIBRARIES
o shared_libs
. La compilación
resuelve los nombres de los módulos en la variante coincidente (es decir,
core
vs. 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
bibliotecas y compara estos DT_SONAME
con las
Entradas de DT_NEEDED
registradas en el objeto binario precompilado. Si hay un elemento
no coincide, se emite un mensaje de error.
En cuarto lugar, el verificador resuelve los símbolos no definidos en el objeto binario precompilado.
Esos símbolos no definidos deben definirse en una de las dependencias y en el
la vinculación de símbolos debe ser GLOBAL
o WEAK
. Si un
el símbolo no definido no se puede resolver, se emite un mensaje de error.
Propiedades de módulos compiladas previamente
Las dependencias del binario precompilado se deben especificar en una de las lo siguiente:
- 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 símbolos indefinidos 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 uno de los lo siguiente:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Ejecuta el verificador
Para ejecutar el verificador, configura la variable de entorno
CHECK_ELF_FILES
a 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 previas se verifican automáticamente durante el proceso de compilación de Android:
make