Almacenamiento tradicional

Icono HAL de almacenamiento externo de Android

Android admite dispositivos con almacenamiento tradicional, que se define como un sistema de archivos que no distingue entre mayúsculas y minúsculas con clases y modos de permisos POSIX inmutables. La noción de almacenamiento tradicional abarca el almacenamiento emulado y portátil. El almacenamiento portátil se define como cualquier almacenamiento externo que no es adoptado por el sistema y, por lo tanto, no está formateado, cifrado ni vinculado a un dispositivo específico. Debido a que el almacenamiento externo tradicional ofrece una protección mínima para los datos almacenados, el código del sistema no debe almacenar datos confidenciales en un almacenamiento externo. Específicamente, los archivos de configuración y de registro solo deben almacenarse en un almacenamiento interno donde puedan protegerse de manera efectiva.

Almacenamiento externo multiusuario

A partir de Android 4.2, los dispositivos pueden admitir varios usuarios y el almacenamiento externo debe cumplir las siguientes restricciones:

  • Cada usuario debe tener su propio almacenamiento externo primario aislado y no debe tener acceso al almacenamiento externo primario de otros usuarios.
  • La ruta /sdcard debe resolverse en el almacenamiento externo primario específico del usuario correcto según el usuario con el que se ejecuta un proceso.
  • El almacenamiento de archivos OBB grandes en el directorio Android/obb se puede compartir entre varios usuarios como optimización.
  • Las aplicaciones no deben poder escribir en el almacenamiento externo secundario, excepto en directorios específicos del paquete, según lo permitan los permisos sintetizados.

La implementación de plataforma predeterminada de esta característica aprovecha los espacios de nombres del kernel de Linux para crear tablas de montaje aisladas para cada proceso bifurcado de Zygote y luego utiliza montajes vinculados para ofrecer el almacenamiento externo primario específico del usuario correcto en ese espacio de nombres privado.

En el arranque, el sistema monta un único demonio FUSE de almacenamiento externo emulado en EMULATED_STORAGE_SOURCE , que está oculto a las aplicaciones. Después de que Zygote se bifurca, monta el subdirectorio específico del usuario apropiado desde el demonio FUSE en EMULATED_STORAGE_TARGET para que las rutas de almacenamiento externo se resuelvan correctamente para la aplicación. Debido a que una aplicación carece de puntos de montaje accesibles para el almacenamiento de otros usuarios, estos solo pueden acceder al almacenamiento del usuario con el que se inició.

Esta implementación también utiliza la función del kernel de subárbol compartido para propagar eventos de montaje desde el espacio de nombres raíz predeterminado a los espacios de nombres de la aplicación, lo que garantiza que funciones como los contenedores ASEC y el montaje OBB sigan funcionando correctamente. Para ello, monta el rootfs como compartido y luego lo vuelve a montar como esclavo después de crear cada espacio de nombres Zygote.

Múltiples dispositivos de almacenamiento externo

A partir de Android 4.4, se muestran varios dispositivos de almacenamiento externo a los desarrolladores a través de Context.getExternalFilesDirs() , Context.getExternalCacheDirs() y Context.getObbDirs() .

Los dispositivos de almacenamiento externo que aparecen a través de estas API deben ser una parte semipermanente del dispositivo (como una ranura para tarjeta SD en un compartimiento de batería). Los desarrolladores esperan que los datos almacenados en estas ubicaciones estén disponibles durante largos períodos de tiempo. Por este motivo, los dispositivos de almacenamiento transitorio (como las unidades de almacenamiento masivo USB) no deben aparecer a través de estas API.

El permiso WRITE_EXTERNAL_STORAGE solo debe otorgar acceso de escritura al almacenamiento externo principal de un dispositivo. No se debe permitir que las aplicaciones escriban en dispositivos de almacenamiento externos secundarios, excepto en sus directorios específicos del paquete, según lo permitan los permisos sintetizados. Restringir las escrituras de esta manera garantiza que el sistema pueda limpiar archivos cuando se desinstalan las aplicaciones.

Soporte de medios USB

Android 6.0 admite dispositivos de almacenamiento portátiles que sólo se conectan al dispositivo durante un corto período de tiempo, como unidades flash USB. Cuando un usuario inserta un nuevo dispositivo portátil, la plataforma muestra una notificación para permitirle copiar o administrar el contenido de ese dispositivo.

En Android 6.0, cualquier dispositivo que no esté adoptado se considera portátil. Debido a que el almacenamiento portátil está conectado solo por un corto tiempo, la plataforma evita operaciones pesadas como el escaneo de medios. Las aplicaciones de terceros deben pasar por el marco de acceso al almacenamiento para interactuar con archivos en el almacenamiento portátil; El acceso directo está explícitamente bloqueado por razones de privacidad y seguridad.