Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Espacio de nombres del vinculador

El enlazador dinámico aborda dos desafíos en el diseño de Treble VNDK:

  • Las bibliotecas compartidas SP-HAL y sus dependencias, incluidas las bibliotecas VNDK-SP, se cargan en los procesos del marco. Debería haber algunos mecanismos para evitar conflictos de símbolos.
  • dlopen() y android_dlopen_ext() puede introducir algunas dependencias de tiempo de ejecución que no son visibles en tiempo de compilación y pueden ser difíciles de detectar mediante el análisis estático.

Estos dos desafíos se pueden resolver mediante el mecanismo de engarce espacio de nombres. Este mecanismo lo proporciona el enlazador dinámico. Puede aislar las bibliotecas compartidas en diferentes espacios de nombres de enlazadores para que las bibliotecas con el mismo nombre de biblioteca pero con diferentes símbolos no entren en conflicto.

Por otro lado, el mecanismo del espacio de nombres del vinculador proporciona la flexibilidad para que algunas bibliotecas compartidas puedan ser exportadas por un espacio de nombres del vinculador y utilizadas por otro espacio de nombres del vinculador. Estas bibliotecas compartidas exportadas pueden convertirse en interfaces de programación de aplicaciones que son públicas para otros programas mientras ocultan sus detalles de implementación dentro de sus espacios de nombres de enlazadores.

Por ejemplo, /system/lib[64]/libcutils.so y /system/lib[64]/vndk-sp-${VER}/libcutils.so dos bibliotecas compartidas. Estas dos bibliotecas pueden tener diferentes símbolos. Están cargados en diferentes espacios de nombres de enlazador de modo que los módulos estructurales pueden depender de /system/lib[64]/libcutils.so y SP-HAL bibliotecas compartidas pueden depender /system/lib[64]/vndk-sp-${VER}/libcutils.so .

Por otro lado, /system/lib[64]/libc.so es un ejemplo de una biblioteca pública que se exportó por un espacio de nombres enlazador e importado en muchos espacios de nombres de engarce. Las dependencias de /system/lib[64]/libc.so , tales como libnetd_client.so , se cargan en el espacio de nombres en el que /system/lib[64]/libc.so reside. Otros espacios de nombres no tendrán acceso a esas dependencias. Este mecanismo encapsula los detalles de implementación mientras proporciona las interfaces públicas.

¿Como funciona?

El enlazador dinámico es responsable de cargar las bibliotecas compartidas especificadas en DT_NEEDED entradas o las bibliotecas compartidas especificados por el argumento de dlopen() o android_dlopen_ext() . En ambos casos, el vinculador dinámico encuentra el espacio de nombres del vinculador donde reside el llamador e intenta cargar las dependencias en el mismo espacio de nombres del vinculador. Si el enlazador dinámico no puede cargar la biblioteca compartida en el espacio de nombres enlazador especificado, se le pide al espacio de nombres enlazador ligado a las bibliotecas compartidas exportados.

Formato de archivo de configuración

El formato del archivo de configuración se basa en el formato de archivo INI. Un archivo de configuración típico se ve así:

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

[system]
additional.namespaces = sphal,vndk

namespace.default.isolated = true
namespace.default.search.paths = /system/${LIB}
namespace.default.permitted.paths = /system/${LIB}/hw
namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}
namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

namespace.sphal.isolated = true
namespace.sphal.visible = true
namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.asan.search.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.asan.permitted.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.links = default,vndk
namespace.sphal.link.default.shared_libs = libc.so:libm.so
namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so

namespace.vndk.isolated = true
namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.links = default
namespace.vndk.link.default.shared_libs = libc.so:libm.so

[vendor]
namespace.default.isolated = false
namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}

El archivo de configuración incluye:

  • Varias propiedades de mapeo de sección de directorio al principio para que el enlazador dinámico seleccione la sección efectiva.
  • Varias secciones de configuración de espacios de nombres del enlazador:
    • Cada sección contiene varios espacios de nombres (vértices de gráficos) y varios enlaces alternativos entre espacios de nombres (arcos de gráficos).
    • Cada espacio de nombres tiene su propio aislamiento, rutas de búsqueda, rutas permitidas y configuraciones de visibilidad.

Las tablas a continuación describen el significado de cada propiedad en detalle.

Propiedad de mapeo de la sección de directorio

Propiedad Descripción Ejemplo

dir. name

Una ruta a un directorio que el [ name ] sección se aplica a.

Cada propiedad asigna los ejecutables en el directorio a una sección de configuración de espacios de nombres del vinculador. Puede haber dos (o más) las propiedades que tienen el mismo name pero apuntan a diferentes directorios.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

Esto indica que la configuración especificada en el [system] sección se aplica a los ejecutables que se cargan desde ya sea /system/bin o /system/xbin .

La configuración especificada en el [vendor] sección se aplica a los ejecutables que se cargan desde /vendor/bin .

Propiedades de relación

Propiedad Descripción Ejemplo
additional. namespaces

Una lista separada por comas de espacios de nombres adicionales (además de la default de espacio de nombres) para la sección.

additional. namespaces = sphal, vndk

Esto indica que hay tres espacios de nombres ( default , sphal , y vndk ) en el [system] de configuración.

namespace. name . links

Una lista separada por comas de espacios de nombres alternativos.

Si no se puede encontrar una biblioteca compartida en el espacio de nombres actual, el vinculador dinámico intenta cargar la biblioteca compartida desde los espacios de nombres alternativos. El espacio de nombres especificado al principio de la lista tiene mayor prioridad.

namespace. sphal. links = default, vndk

Si una biblioteca compartida o un archivo ejecutable peticiones de una biblioteca compartida que no se puede cargar en la sphal espacio de nombres, los intentos de enlazador dinámico para cargar la biblioteca compartida desde el default de espacio de nombres.

Y luego, si la biblioteca compartida no se puede cargar desde el default de espacio de nombres o bien, los intentos de enlazador dinámico para cargar la biblioteca compartida de la vndk espacio de nombres.

Finalmente, si todos los intentos fallan, el vinculador dinámico devuelve un error.

namespace. name . link. other . shared_libs

Una lista separada por comas de las bibliotecas compartidas que se pueden buscar en los other espacios de nombres cuando esas bibliotecas no se pueden encontrar en el name espacio de nombres.

Esta propiedad no se puede utilizar con el namespace. name . link. other . allow_all_shared_libs .

namespace. sphal. link. default. shared_libs = libc.so: libm.so

Esto indica que el enlace de reserva sólo acepta libc.so o libm.so como el nombre de la biblioteca solicitada. El enlazador dinámico ignora el enlace de retorno desde sphal a default espacio de nombres si el nombre de la biblioteca solicitada no es libc.so o libm.so .

namespace. name . link. other . allow_all_shared_libs

Un valor booleano que indica si todas las bibliotecas compartidas se pueden buscar en el other espacio de nombres cuando esas bibliotecas no se pueden encontrar en el name espacio de nombres.

Esta propiedad no se puede utilizar con el namespace. name . link. other . shared_libs .

namespace. vndk. link. sphal. allow_all_shared_libs = true

Esto indica que todos los nombres de biblioteca pueden caminar a través del enlace de retorno desde vndk a sphal espacio de nombres.

Propiedades del espacio de nombres

Propiedad Descripción Ejemplo
namespace. name . isolated

Un valor booleano que indica si el vinculador dinámico debe verificar dónde reside la biblioteca compartida.

Si isolated es true sólo las bibliotecas, que son compartidos en una de las search.paths directorios (excluidos los subdirectorios) o se encuentran bajo una de las permitted.paths directorios (incluyendo subdirectorios) se pueden cargar.

Si isolated es false (por defecto), el enlazador dinámico no comprueba la ruta de bibliotecas compartidas.

namespace. sphal. isolated = true

Esto indica que sólo las bibliotecas compartidas en search.paths o bajo permitted.paths se pueden cargar en el sphal espacio de nombres.

namespace. name . search.paths

Una lista de directorios separados por dos puntos para buscar bibliotecas compartidas.

Los directorios especificados en search.paths se antepone al nombre de la biblioteca solicitada si las llamadas de función a dlopen() o DT_NEEDED entradas no se especifica la ruta completa. El directorio especificado al principio de la lista tiene mayor prioridad.

Cuando isolated es true bibliotecas, que son compartidos en una de las search.paths directorios (excluidos los subdirectorios) se pueden cargar independientemente de la permitted.paths propiedad.

Por ejemplo, si search.paths es /system/${LIB} y permitted.paths está vacía, /system/${LIB}/libc.so puede cargarse pero /system/${LIB}/vndk/libutils.so no se puede cargar.

namespace. default. search.paths = /system/${LIB}

Esto indica que las búsquedas dinámica enlazador /system/${LIB} para las bibliotecas compartidas.

namespace. name . asan.search.paths

Una lista separada por comas de los directorios para buscar bibliotecas compartidas cuando AddressSanitizer (Asan) está activado.

namespace. name . search.paths se ignora cuando se asan está activado.

namespace. default. asan.search.paths = /data/asan/system/${LIB}: /system/${LIB}

Esto indica que cuando se asan se habilita las búsquedas dinámica enlazador /data/asan/system/${LIB} primero y luego búsquedas /system/${LIB} .

namespace. name . permitted.paths

Una lista de colon de directorios separados (incluyendo subdirectorios) en el que el enlazador dinámico puede cargar las bibliotecas compartidas (además de search.paths ) cuando isolated es true .

Las bibliotecas compartidas que se encuentran en los subdirectorios de permitted.paths también se pueden cargar. Por ejemplo, si permitted.paths es /system/${LIB} , tanto /system/${LIB}/libc.so y /system/${LIB}/vndk/libutils.so se puede cargar.

Si isolated es false , permitted.paths se ignoran y una advertencia se emite.

namespace. default. permitted.paths = /system/${LIB}/hw

Esto indica que las bibliotecas compartidas bajo /system/${LIB}/hw se pueden cargar en la aislada default espacio de nombres.

Por ejemplo, sin permitted.paths , libaudiohal.so no puede cargar /system/${LIB}/hw/audio.a2dp.default.so en el default del espacio de nombres.

namespace. name . asan.permitted.paths

Una lista separada por dos puntos de directorios donde el enlazador dinámico puede cargar las bibliotecas compartidas cuando ASAN está habilitada.

namespace. name . permitted.paths se ignora cuando se asan está activado.

namespace. default. asan.permitted.paths = /data/asan/system/${LIB}/hw: /system/${LIB}/hw

Esto indica que cuando se asan se habilita bibliotecas compartidas bajo /data/asan/system/${LIB}/hw o /system/${LIB}/hw se puede cargar a la aislada default espacio de nombres.

namespace. name . visible

Un valor booleano que indica si el programa (que no sea libc ) puede obtener un identificador enlazador espacio de nombres con android_get_exported_namespace() y abrir una biblioteca compartida en el espacio de nombres enlazador pasando el mango para android_dlopen_ext() .

Si visible es true , android_get_exported_namespace() siempre devuelve el identificador si existe el espacio de nombres.

Si visible es false (por defecto), android_get_exported_namespace() siempre devuelve NULL independientemente de la presencia del espacio de nombres. Las bibliotecas compartidas se pueden cargar en este espacio de nombres solo si (1) son solicitadas por otro espacio de nombres vinculador que tiene un enlace de respaldo a este espacio de nombres, o (2) son solicitadas por otras bibliotecas compartidas o ejecutables en este espacio de nombres.

namespace. sphal. visible = true

Esto indica que android_get_exported_namespace("sphal") puede devolver un identificador de espacio de nombres enlazador válida.

Creación de espacio de nombres del vinculador

En Android 11, la configuración del enlazador se crea en tiempo de ejecución bajo /linkerconfig en lugar de utilizar archivos de texto plano en ${android-src}/system/core/rootdir/etc . La configuración se genera en el momento del arranque según el entorno de ejecución, que incluye los siguientes elementos:

  • Si el dispositivo es compatible con VNDK
  • Versión de VNDK de destino de la partición del proveedor
  • Versión de VNDK de la partición del producto
  • Módulos APEX instalados

La configuración del vinculador se crea resolviendo las dependencias entre los espacios de nombres del vinculador. Por ejemplo, si hay actualizaciones en los módulos APEX que incluyen actualizaciones de dependencia, se genera la configuración del vinculador que refleja estos cambios. Más detalles de configuración para crear enlazador se pueden encontrar en ${android-src}/system/linkerconfig .

Aislamiento del espacio de nombres del vinculador

Hay tres tipos de configuración. Dependiendo del valor de PRODUCT_TREBLE_LINKER_NAMESPACES y BOARD_VNDK_VERSION en BoardConfig.mk , la configuración correspondiente se genera en el momento de arranque.

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
Configuración seleccionada Requisito de VTS
true current VNDK Obligatorio para dispositivos lanzados con Android 9 o superior
Vacío VNDK Lite Obligatorio para dispositivos lanzados con Android 8.x
false Vacío Legacy Para dispositivos que no son de agudos

La configuración de VNDK Lite aísla las bibliotecas compartidas SP-HAL y VNDK-SP. En Android 8.0, este debe ser el archivo de configuración para enlazador dinámico cuando PRODUCT_TREBLE_LINKER_NAMESPACES es true .

La configuración de VNDK también aísla las bibliotecas compartidas SP-HAL y VNDK-SP. Además, esta configuración proporciona el aislamiento dinámico completo del enlazador. Asegura que los módulos en la partición del sistema no dependan de las bibliotecas compartidas en las particiones del proveedor y viceversa.

En Android 8.1 o superior, configuración VNDK es la configuración por defecto y es muy recomendable para permitir el aislamiento completo enlazador dinámico mediante el establecimiento de BOARD_VNDK_VERSION al current .

Configuración de VNDK

La configuración de VNDK aísla las dependencias de la biblioteca compartida entre la partición del sistema y las particiones del proveedor. En comparación con las configuraciones mencionadas en la subsección anterior, las diferencias se describen a continuación:

  • Procesos marco

    • default , vndk , sphal , y rs se crean espacios de nombres.
    • Todos los espacios de nombres están aislados.
    • Bibliotecas del sistema compartida se cargan en el default del espacio de nombres.
    • SP-HAL se cargan en el sphal espacio de nombres.
    • VNDK-SP bibliotecas compartidas cargados en el vndk espacio de nombres.
  • Procesos de proveedores

    • default , vndk , y system se crean espacios de nombres.
    • El default está aislado del espacio de nombres.
    • Bibliotecas de proveedores compartida se cargan en el default del espacio de nombres.
    • VNDK y VNDK-SP bibliotecas compartidas se cargan en el vndk espacio de nombres.
    • LL-NDK y sus dependencias se cargan en el system espacio de nombres.

La relación entre los espacios de nombres del enlazador se ilustra a continuación.

Gráfico de espacio de nombres del vinculador descrito en la configuración de VNDK
Figura 1. Enlazador espacio de nombres de aislamiento (configuración VNDK)

En la imagen anterior, LL-NDK y soporte VNDK-SP para el seguimiento de las bibliotecas compartidas:

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libGLESv3.so
    • libandroid_net.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libneuralnetworks.so
    • libsync.so
    • libvndksupport.so
    • libvulkan.so
  • VNDK-SP
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libRSCpuRef.so
    • libRSDriver.so
    • libRS_internal.so
    • libbase.so
    • libbcinfo.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so
    • libz.so

Puede encontrar más detalles en /linkerconfig/ld.config.txt desde el dispositivo.

Configuración de VNDK Lite

A partir de Android 8.0, el vinculador dinámico está configurado para aislar las bibliotecas compartidas SP-HAL y VNDK-SP de modo que sus símbolos no entren en conflicto con otras bibliotecas compartidas del marco. La relación entre los espacios de nombres del vinculador se muestra a continuación.

Gráfico del espacio de nombres del vinculador descrito en la configuración de VNDK Lite
Figura 2. Enlazador aislamiento espacio de nombres (VNDK configuración Lite)

LL-NDK y VNDK-SP representan siguientes bibliotecas compartidas:

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (no en la configuración)
    • libsync.so
    • libvndksupport.so
    • libz.so (movido a VNDK-SP en la configuración)
  • VNDK-SP
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libbase.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so

La siguiente tabla lista los espacios de nombres de configuración para los procesos de marco, que es un extracto de la [system] sección en la configuración VNDK Lite.

Espacio de nombres Propiedad Valor
default search.paths /system/${LIB}
/odm/${LIB}
/vendor/${LIB}
/product/${LIB}
isolated false
sphal search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
isolated true
visible true
links default,vndk,rs
link.default.shared_libs LL-NDK
link.vndk.shared_libs VNDK-SP
link.rs.shared_libs libRS_internal.so
vndk (por VNDK-SP) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
permitted.paths /odm/${LIB}/hw
/odm/${LIB}/egl
/vendor/${LIB}/hw
/vendor/${LIB}/egl
/system/${LIB}/vndk-sp-${VER}/hw
isolated true
visible true
links default
link.default.shared_libs LL-NDK
rs (por RenderScript) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
/odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
/data (por núcleo compilado RS)
isolated true
visible true
links default,vndk
link.default.shared_libs LL-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

La siguiente tabla presenta configuración de los espacios de nombres para los procesos de proveedores, que es un extracto de la [vendor] sección en la configuración VNDK Lite.

Espacio de nombres Propiedad Valor
default search.paths /odm/${LIB}
/odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
/system/${LIB} (en desuso)
/product/${LIB} (en desuso)
isolated false

Más detalles se pueden encontrar en /linkerconfig/ld.config.txt desde el dispositivo.

Historia del documento

Cambios en Android 11

  • En Android 11, la estática ld.config.*.txt archivos se eliminan de la base de código y LinkerConfig los genera en tiempo de ejecución en su lugar.

Cambios en Android 9

  • En Android 9, el vndk se añade enlazador espacio de nombres a los procesos de los proveedores y VNDK bibliotecas compartidas están aislados del espacio de nombres por defecto enlazador.
  • Reemplazar PRODUCT_FULL_TREBLE con más específicos PRODUCT_TREBLE_LINKER_NAMESPACES .
  • Android 9 cambia los nombres de los siguientes archivos de configuración del vinculador dinámico.
    Android 8.x Android 9 Descripción
    ld.config.txt.in ld.config.txt Para dispositivos con aislamiento de espacio de nombres del vinculador en tiempo de ejecución
    ld.config.txt ld.config.vndk_lite.txt Para dispositivos con aislamiento de espacio de nombres del vinculador VNDK-SP
    ld.config.legacy.txt ld.config.legacy.txt Para dispositivos heredados con Android 7.xo versiones anteriores
  • Retire android.hardware.graphics.allocator@2.0.so .
  • product y odm se añaden particiones.