Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Comprobador de usos de ABI prediseñado

Las bibliotecas compartidas de Android evolucionan de vez en cuando. Mantener actualizados los binarios prediseñados requiere un esfuerzo considerable. En Android 9 o versiones anteriores, los archivos binarios prediseñados que dependen de las bibliotecas o ABI eliminadas solo no se pueden vincular en tiempo de ejecución. Los desarrolladores tienen que rastrear los registros para encontrar los binarios prediseñados obsoletos. En Android 10, se introduce un verificador de usos ABI basado en símbolos. El verificador puede detectar binarios prediseñados obsoletos en el momento de la compilación, de modo que los desarrolladores de bibliotecas compartidas puedan saber qué binarios prediseñados podrían romperse por su cambio y qué binarios prediseñados deben reconstruirse.

Comprobador 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 prediseñado con las dependencias del binario prediseñado y comprueba si se resuelven todos los símbolos indefinidos.

Primero, el verificador verifica la arquitectura de destino del binario prediseñado. Si el binario prediseñado no apunta a la arquitectura ARM, AArch64, x86 o x86-64, el verificador omite el binario prediseñado.

En segundo lugar, las dependencias del binario prediseñado deben aparecer en LOCAL_SHARED_LIBRARIES o shared_libs . El sistema de compilación resuelve los nombres de los módulos en la variante correspondiente (es decir, core frente al vendor ) de las bibliotecas compartidas.

En tercer lugar, el corrector compara los DT_NEEDED entradas a 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 prediseñado. Si hay una discrepancia, se emite un mensaje de error.

Cuarto, el corrector resuelve los símbolos indefinidos en el binario prediseñado. Esos símbolos indefinidos deben definirse en una de las dependencias y el enlace de símbolos 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 prediseñado 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 prediseñado está diseñado para tener algunos símbolos indefinidos irresolubles , especifique uno de los siguientes:

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Para que el binario prediseñado omita la verificación del archivo ELF, especifique una de las siguientes opciones:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

Ejecuta el corrector

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

Reparador 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 solución sugerida en stdout. Opcionalmente, ejecute el reparador con la opción --in --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>