Espacios de nombres para bibliotecas nativas

Android 7.0 introdujo espacios de nombres para bibliotecas nativas para limitar la visibilidad interna de la API y resolver situaciones en las que las aplicaciones usan accidentalmente bibliotecas de plataforma en lugar de las propias. Consulte la publicación del blog Mejora de la estabilidad con restricciones de símbolos C/C++ privados en Android 7.0 para desarrolladores de Android para conocer los cambios específicos de la aplicación.

Arquitectura

En Android 7.0 y versiones posteriores, las bibliotecas del sistema están separadas de las bibliotecas de aplicaciones.

Espacios de nombres para bibliotecas nativas

Figura 1. Espacios de nombres para bibliotecas nativas

Los espacios de nombres para bibliotecas nativas evitan que las aplicaciones usen API nativas de plataforma privada (como se hizo con OpenSSL). También elimina situaciones en las que las aplicaciones accidentalmente usan bibliotecas de plataforma en lugar de las propias (como se vio con libpng ). Es difícil que las bibliotecas de aplicaciones utilicen bibliotecas internas del sistema por accidente (y viceversa).

Adición de bibliotecas nativas adicionales

Además de las bibliotecas nativas públicas estándar, los proveedores de silicio (a partir de Android 7.0) y los fabricantes de dispositivos (a partir de Android 9) pueden optar por proporcionar bibliotecas nativas adicionales accesibles para las aplicaciones colocándolas en las carpetas de biblioteca respectivas y enumerándolas explícitamente en .txt archivos

Las carpetas de la biblioteca son:

  • /vendor/lib (para 32 bits) y /vendor/lib64 (para 64 bits) para bibliotecas de proveedores de silicio
  • /system/lib (para 32 bits) y /system/lib64 (para 64 bits) para bibliotecas de fabricantes de dispositivos

Los archivos .txt son:

  • /vendor/etc/public.libraries.txt para bibliotecas de proveedores de silicio
  • /system/etc/public.libraries-COMPANYNAME.txt para bibliotecas de fabricantes de dispositivos, donde COMPANYNAME hace referencia al nombre del fabricante (como awesome.company ). COMPANYNAME debe coincidir con [A-Za-z0-9_.-]+ ; caracteres alfanuméricos, _, . (punto) y -. Es posible tener múltiples archivos .txt de este tipo en un dispositivo si algunas bibliotecas son de proveedores de soluciones externos.

Las bibliotecas nativas en la partición del system que hacen públicas los fabricantes de dispositivos DEBEN llamarse lib*COMPANYNAME.so , por ejemplo, libFoo.awesome.company.so . En otras palabras, libFoo.so sin el sufijo del nombre de la empresa NO DEBE hacerse público. El COMPANYNAME en el nombre del archivo de la biblioteca DEBE coincidir con el COMPANYNAME en el nombre del archivo txt en el que aparece el nombre de la biblioteca.

Las bibliotecas nativas que forman parte de AOSP NO DEBEN hacerse públicas (excepto las bibliotecas nativas públicas estándar que son públicas de forma predeterminada). Solo las bibliotecas adicionales agregadas por los proveedores de silicio o los fabricantes de dispositivos pueden ser accesibles para las aplicaciones.

A partir de Android 8.0, las bibliotecas públicas de proveedores tienen las siguientes restricciones adicionales y configuraciones requeridas:

  1. La biblioteca nativa del proveedor debe estar debidamente etiquetada para que las aplicaciones puedan acceder a ella. Si alguna aplicación requiere acceso (incluidas aplicaciones de terceros), la biblioteca debe estar etiquetada como same_process_hal_file en un archivo file_contexts específico del proveedor de la siguiente manera:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    donde libnative.so es el nombre de la biblioteca nativa.
  2. La biblioteca, ya sea directamente o transitivamente a través de sus dependencias, no debe depender de bibliotecas del sistema que no sean las bibliotecas VNDK-SP y LLNDK. Busque la lista de bibliotecas VNDK-SP y LLNDK en development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv .

Actualización de aplicaciones para no usar bibliotecas nativas no públicas

Esta característica está habilitada solo para aplicaciones que tienen como destino la versión 24 o posterior del SDK; para obtener compatibilidad con versiones anteriores, consulte la Tabla 1. Qué esperar si su aplicación se vincula con bibliotecas nativas privadas . La lista de bibliotecas nativas de Android a las que pueden acceder las aplicaciones (también conocidas como bibliotecas nativas públicas) se incluye en la sección 3.1.1 de CDD. Las aplicaciones dirigidas a 24 o posteriores y que usan bibliotecas no públicas deben actualizarse. Consulte Vinculación de aplicaciones NDK a bibliotecas de plataforma para obtener más detalles.

Actualización de aplicaciones para sus dependencias de bibliotecas nativas

Las aplicaciones que tienen como destino la versión 31 del SDK (Android 12) o superior deben especificar explícitamente sus dependencias de bibliotecas nativas compartidas mediante la etiqueta <uses-native-library> en el manifiesto de la aplicación. Si alguna parte de la biblioteca solicitada no existe en el dispositivo, la aplicación no está instalada. Cuando se instalan las aplicaciones, solo se les proporcionan las bibliotecas compartidas nativas que han solicitado. Esto significa que las aplicaciones no pueden acceder a las bibliotecas compartidas nativas que no aparecen en el manifiesto de la aplicación.