Almacenamiento con alcance

El almacenamiento limitado limita el acceso de la aplicación al almacenamiento externo. En Android 11 o superior, las aplicaciones que se orientan a API 30 o superior deben usar almacenamiento delimitado. Anteriormente, en Android 10, las aplicaciones podían excluirse del almacenamiento limitado.

Restricciones de acceso a la aplicación

El objetivo del almacenamiento delimitado es proteger la privacidad de la aplicación y los datos del usuario. Esto incluye proteger la información del usuario (como los metadatos de las fotos), evitar que las aplicaciones modifiquen o eliminen los archivos del usuario sin un permiso explícito y proteger los documentos confidenciales del usuario descargados en Descargas u otras carpetas.

Las aplicaciones que usan almacenamiento con ámbito pueden tener los siguientes niveles de acceso (el acceso real es específico de la implementación).

  • Acceso de lectura y escritura a sus propios archivos sin permisos
  • Acceso de lectura a archivos multimedia de otras aplicaciones con permiso READ_EXTERNAL_STORAGE
  • El acceso de escritura a los archivos multimedia de otras aplicaciones solo se permite con el consentimiento directo del usuario (excepciones otorgadas a la Galería del sistema y las aplicaciones que son elegibles para el acceso a Todos los archivos)
  • Sin acceso de lectura o escritura a los directorios de datos de aplicaciones externas de otras aplicaciones

Uso de almacenamiento con alcance con FUSE

Android 11 o superior es compatible con el sistema de archivos en el espacio de usuario (FUSE), que permite que el módulo MediaProvider examine las operaciones de archivos en el espacio del usuario y controle el acceso a los archivos según la política para permitir , denegar o redactar el acceso. Las aplicaciones en almacenamiento con ámbito que usan FUSE obtienen las características de privacidad del almacenamiento con ámbito y la capacidad de acceder a los archivos mediante una ruta de archivo directa (manteniendo las API de archivo funcionando en las aplicaciones).

Android 10 aplicó reglas de almacenamiento con alcance en los accesos a archivos por parte de MediaProvider, pero no para el acceso directo a la ruta de archivo (por ejemplo, mediante la API de archivos y las API de NDK) debido al esfuerzo requerido para interceptar las llamadas del kernel. Como resultado, las aplicaciones en el almacenamiento con ámbito no podían acceder a los archivos mediante una ruta de archivo directa. Esta restricción afectó la capacidad de adaptación de los desarrolladores de aplicaciones, ya que requería cambios sustanciales en el código para reescribir el acceso de File API a MediaProvider API.

FUSIBLE y tarjeta SDFS

La compatibilidad con Android 11 para FUSE no está relacionada con la obsolescencia de SDCardFS , pero proporciona una alternativa a Media Store para dispositivos que anteriormente usaban SDCardFS. Dispositivos:

  • El lanzamiento con Android 11 o superior con kernel 5.4 o superior no puede usar SDCardFS.
  • La actualización a Android 11 o superior puede alojar FUSE sobre SDCardFS para interceptar las operaciones de archivos y cumplir con los objetivos de privacidad.

Ajuste de rendimiento FUSE

Anteriormente, Android admitía FUSE en Android 7 o inferior, en el que el almacenamiento externo se montaba como FUSE. Debido a problemas de rendimiento y punto muerto con esa implementación de FUSE, Android 8 introdujo SDCardFS. Android 11 reintroduce la compatibilidad con FUSE mediante una implementación mejorada y mejor probada de libfuse que se puede ajustar para resolver los problemas de rendimiento en Android 7 o versiones anteriores.

El ajuste de FUSE incluye los siguientes ajustes:

  • Omitir FUSE para los directorios Android/data y Android/obb para mejorar el rendimiento de las aplicaciones de juegos que dependen de estos directorios.
  • Optimizaciones (como ajustar las proporciones sucias y de lectura anticipada del sistema de archivos FUSE) para mantener el rendimiento de las lecturas y la reproducción de medios sin problemas.
  • Uso de la caché de reescritura de FUSE.
  • Permisos de almacenamiento en caché para reducir las IPC al servidor del sistema.
  • Optimizaciones para aplicaciones con acceso a Todos los archivos para acelerar las operaciones masivas.

Los ajustes de ajuste anteriores pueden producir un rendimiento comparable entre dispositivos FUSE y no FUSE. Por ejemplo, al probar un Pixel 2 sintonizado con FUSE y un Pixel 2 con Media Store, se encontró un rendimiento de lectura secuencial comparable (por ejemplo, reproducción de video) entre el acceso a la ruta del archivo y Media Store. Sin embargo, las escrituras secuenciales eran ligeramente peores con FUSE, y las lecturas y escrituras aleatorias podían ser hasta el doble de lentas.

Las medidas de rendimiento pueden cambiar de un dispositivo a otro y entre casos de uso específicos. Debido a que las API de MediaProvider brindan el rendimiento más consistente, los desarrolladores de aplicaciones preocupados por el rendimiento deben usar las API de MediaProvider para sus aplicaciones.

Mitigación del impacto en el rendimiento de FUSE

El impacto en el rendimiento de FUSE se limita a los grandes usuarios de archivos almacenados en almacenamiento compartido externo únicamente. FUSE omite el almacenamiento privado externo (que incluye los directorios android/data y android/obb ), mientras que el almacenamiento interno (como /data/data , donde muchas aplicaciones almacenan datos para mantenerlos cifrados y seguros) no está montado por FUSE.

  • Las aplicaciones que utilizan poco el almacenamiento externo compartido a menudo interactúan con un conjunto limitado de archivos (normalmente, menos de 100 archivos). Estas aplicaciones se benefician de las optimizaciones existentes de las operaciones comunes de lectura y escritura y no deberían ver ningún impacto en el rendimiento relacionado con FUSE en Android 11.

  • Las aplicaciones que utilizan mucho el almacenamiento externo compartido suelen realizar operaciones masivas de archivos, como enumerar o eliminar un directorio con 1000 archivos, o crear o eliminar un directorio con un millón de archivos en el sistema de archivos. Las operaciones de archivos masivos pueden verse afectadas por FUSE en Android 11, pero si dichas aplicaciones son elegibles para el permiso MANAGE_EXTERNAL_STORAGE , se benefician de las optimizaciones de rendimiento incluidas en la actualización de octubre de 2020.

Para evitar la sobrecarga de rendimiento de FUSE, las aplicaciones pueden almacenar datos en un almacenamiento privado externo o usar API masivas en la clase ContentProvider para omitir FUSE y obtener una ruta de rendimiento optimizado. Además, la actualización de octubre de 2020 del componente del sistema MediaProvider incluye optimizaciones de rendimiento para administradores de archivos y aplicaciones similares (como respaldo/restauración, antivirus) que tienen el permiso MANAGE_EXTERNAL_STORAGE .

Privacidad sobre rendimiento

En los dispositivos que se ajustaron para FUSE, la mayoría de los recorridos críticos de los usuarios tienen el mismo rendimiento entre Android 10 y Android 11. Sin embargo, cuando se prueban puntos de referencia sobre un conjunto de operaciones de archivos, Android 11 puede funcionar peor que Android 10. Para los patrones de acceso a archivos que funcionan peor en Android 11 (por ejemplo, lecturas o escrituras aleatorias), recomendamos usar las API de MediaProvider para dar a las aplicaciones un modo de acceso que no sea FUSE, que es la mejor opción y la que ofrece un rendimiento constante.

Actualizaciones de MediaProvider y FUSE

El comportamiento del componente del sistema MediaProvider difiere entre las versiones de Android.

  • En Android 10 y versiones anteriores, SDCardFS era el sistema de archivos y MediaProvider proporcionaba una interfaz para colecciones de archivos (por ejemplo, imágenes, videos, archivos de música, etc.). Cuando una aplicación creaba un archivo usando File API, podía pedirle a MediaProvider que escaneara el archivo y lo registrara en la base de datos.

  • En Android 11 o superior, SDCardFS está obsoleto y MediaProvider se convierte en el controlador del sistema de archivos (para FUSE) para el almacenamiento externo, lo que hace que el sistema de archivos en el almacenamiento externo y la base de datos de MediaProvider sean consistentes. Como controlador de espacio de usuario para el sistema de archivos FUSE, MediaProvider puede interceptar las llamadas del kernel y garantizar que las operaciones con archivos sean seguras para la privacidad.

En Android 11 y versiones posteriores, MediaProvider también es un componente de sistema modular (un módulo Mainline) que se puede actualizar fuera de las versiones de Android. Esto significa que los problemas de rendimiento, privacidad o seguridad que se encuentren en MediaProvider se pueden solucionar y enviar de forma inalámbrica desde Google Play Store u otros mecanismos proporcionados por socios. Cualquier cosa dentro del alcance de lo que se espera de un controlador FUSE también es actualizable, lo que permite actualizaciones para corregir regresiones y errores de rendimiento de FUSE.