Verificador de usos de ABI compilado previamente

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