Almacenamiento específico

El almacenamiento específico limita el acceso de la app al almacenamiento externo. En Android 11 o versiones posteriores, las apps segmentadas para la API 30 o versiones posteriores deben usar almacenamiento específico. Anteriormente, en Android 10, las apps podían inhabilitar el almacenamiento específico.

Restricciones de acceso a la app

El objetivo del almacenamiento específico es proteger la privacidad de los datos del usuario y de la app. Esto incluye proteger la información del usuario (como los metadatos de las fotos), evitar que las apps modifiquen o borren los archivos del usuario sin permiso explícito y proteger los documentos sensibles del usuario que se descargan en la carpeta Descargas o en otras carpetas.

Las apps que usan almacenamiento específico pueden tener los siguientes niveles de acceso (el acceso real depende de la implementación).

  • Acceso de lectura y escritura a sus propios archivos sin permisos
  • Acceso de lectura a los archivos multimedia de otras apps con el permiso READ_EXTERNAL_STORAGE
  • El acceso de escritura a los archivos multimedia de otras apps solo se permite con el consentimiento directo del usuario (se otorgan excepciones a la Galería del sistema y a las apps aptas para el acceso a Todos los archivos).
  • No hay acceso de lectura ni de escritura a los directorios de datos externos de otras apps

Usa el almacenamiento específico con FUSE

Android 11 o versiones posteriores admiten el sistema de archivos en el espacio del usuario (FUSE), lo 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 ocultar el acceso. Las apps en el almacenamiento específico que usan FUSE obtienen las funciones de privacidad del almacenamiento específico y la capacidad de acceder a los archivos con una ruta de acceso directa (lo que mantiene el funcionamiento de las APIs de File en las apps).

Android 10 aplicó reglas de almacenamiento con permisos en el acceso a archivos por parte de MediaProvider, pero no para el acceso directo a la ruta de archivos (por ejemplo, con la API de File y las APIs del NDK) debido al esfuerzo que se requiere para interceptar las llamadas del kernel. Como resultado, las apps en el almacenamiento específico no podían acceder a los archivos con una ruta de acceso directa. Esta restricción afectó la capacidad de adaptación de los desarrolladores de apps, ya que requirió cambios sustanciales en el código para reescribir el acceso a la API de File en la API de MediaProvider.

FUSE y SDCardFS

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

  • Los dispositivos que se lanzan con Android 11 o versiones posteriores y que usan el kernel 5.4 o versiones posteriores no pueden usar SDCardFS.
  • La actualización a Android 11 o versiones posteriores puede alojar FUSE sobre SDCardFS para interceptar las operaciones de archivos y cumplir con los objetivos de privacidad.

Ajuste del rendimiento de FUSE

Anteriormente, Android admitía FUSE en Android 7 o versiones anteriores, en las que el almacenamiento externo se activaba como FUSE. Debido a problemas de rendimiento y de bloqueo con esa implementación de FUSE, Android 8 introdujo SDCardFS. Android 11 reintroduce la compatibilidad con FUSE a través de 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 cambios:

  • Se omitió FUSE para los directorios Android/data y Android/obb para mejorar el rendimiento de las apps de juegos que dependen de estos directorios.
  • Optimizaciones (como el ajuste de las relaciones de lectura anticipada y de datos sucios del sistema de archivos FUSE) para mantener un rendimiento de lectura alto y una reproducción de medios fluida
  • Usa la caché de escritura diferida de FUSE.
  • Permisos de almacenamiento en caché para reducir las IPC al servidor del sistema.
  • Se realizaron optimizaciones para las apps con acceso a todos los archivos para que las operaciones masivas sean más rápidas.

Los ajustes anteriores pueden producir un rendimiento comparable entre los dispositivos FUSE y los que no son FUSE. Por ejemplo, las pruebas de un Pixel 2 optimizado con FUSE y un Pixel 2 con Media Store mostraron un rendimiento de lectura secuencial comparable (por ejemplo, reproducción de video) entre el acceso a la ruta de acceso del archivo y Media Store. Sin embargo, las escrituras secuenciales fueron ligeramente peores con FUSE, y las lecturas y escrituras aleatorias podrían ser hasta dos veces más lentas.

Las mediciones de rendimiento pueden cambiar de un dispositivo a otro y entre casos de uso específicos. Dado que las APIs de MediaProvider ofrecen el rendimiento más coherente, los desarrolladores de apps que se preocupan por el rendimiento deberían usar las APIs de MediaProvider en sus apps.

Mitiga el impacto en el rendimiento de FUSE

El impacto en el rendimiento de FUSE se limita a los usuarios frecuentes de archivos almacenados en el almacenamiento compartido externo. 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 apps almacenan datos para mantenerlos encriptados y seguros) no se monta en FUSE.

  • Las apps que son usuarios ligeros del almacenamiento externo compartido suelen interactuar con un conjunto limitado de archivos (por lo general, menos de 100 archivos). Estas apps se benefician de las optimizaciones existentes de las operaciones comunes de lectura y escritura, y no deberían experimentar ningún impacto en el rendimiento relacionado con FUSE en Android 11.

  • Las apps que usan mucho el almacenamiento externo compartido suelen realizar operaciones de archivos masivas, como enumerar o quitar un directorio con 1,000 archivos, o bien crear o borrar un directorio con un millón de archivos en el sistema de archivos. Las operaciones de archivos masivas pueden verse afectadas por FUSE en Android 11, pero si estas apps son aptas 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 apps pueden almacenar datos en el almacenamiento privado externo o usar APIs masivas en la clase ContentProvider para omitir FUSE y obtener una ruta de acceso optimizada para el rendimiento. Además, la actualización de octubre de 2020 del componente del sistema MediaProvider incluye optimizaciones de rendimiento para administradores de archivos y apps similares (como copias de seguridad y restauración, antivirus) que tienen el permiso MANAGE_EXTERNAL_STORAGE.

Privacidad por sobre el rendimiento

En los dispositivos que se ajustaron para FUSE, la mayoría de los recorridos de usuario críticos tienen el mismo rendimiento en Android 10 y Android 11. Sin embargo, cuando se prueban comparativas en un conjunto de operaciones de archivos, es posible que Android 11 tenga un rendimiento inferior al de Android 10. Para los patrones de acceso a archivos que tienen un rendimiento inferior en Android 11 (por ejemplo, lecturas o escrituras aleatorias), recomendamos usar las APIs de MediaProvider para brindarles a las apps 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étera). Cuando una app creaba un archivo con la API de File, podía pedirle a MediaProvider que lo analizara y lo registrara en la base de datos.

  • En Android 11 y versiones posteriores, SDCardFS dejó de estar disponible y MediaProvider se convirtió en el controlador del sistema de archivos (para FUSE) del almacenamiento externo, lo que hace que el sistema de archivos del almacenamiento externo y la base de datos de MediaProvider sean coherentes. Como controlador del espacio de usuario para el sistema de archivos FUSE, MediaProvider puede interceptar llamadas del kernel y garantizar que las operaciones de archivos sean seguras para la privacidad.

En Android 11 y versiones posteriores, MediaProvider también es un componente modular del sistema (un módulo de 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 corregir y entregar de forma inalámbrica desde Google Play Store o a través de otros mecanismos proporcionados por socios. Todo lo que se encuentre dentro del alcance de lo que se espera de un controlador de FUSE también se puede actualizar, lo que permite que las actualizaciones corrijan las regresiones y los errores de rendimiento de FUSE.