
Android admite dispositivos con almacenamiento tradicional, que se define como un sistema de archivos que no distingue entre mayúsculas y minúsculas con modos y clases de permisos POSIX inmutables. La noción de almacenamiento tradicional abarca el almacenamiento portátil y emulado. 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 o 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 el almacenamiento externo. Específicamente, los archivos de configuración y de registro solo deben almacenarse en el almacenamiento interno donde se puedan proteger 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 una 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 función aprovecha los espacios de nombres del kernel de Linux para crear tablas de montaje aisladas para cada proceso bifurcado de Zygote, y luego usa montajes de enlace 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 para las aplicaciones. Después de que Zygote se bifurca, enlaza monta el subdirectorio específico del usuario apropiado debajo del demonio FUSE a 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, solo pueden acceder al almacenamiento del usuario con el que se inició.
Esta implementación también utiliza la función de 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 vuelve a montarlo como esclavo después de que se crea cada espacio de nombres Zygote.
Múltiples dispositivos de almacenamiento externo
A partir de Android 4.4, los desarrolladores pueden Context.getExternalFilesDirs()
varios dispositivos de almacenamiento externo a través de Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
y Context.getObbDirs()
.
El permiso WRITE_EXTERNAL_STORAGE
solo debe otorgar acceso de escritura al almacenamiento externo primario en 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 asegura que el sistema pueda limpiar los archivos cuando se desinstalan las aplicaciones.
Soporte de medios USB
Android 6.0 admite dispositivos de almacenamiento portátiles que solo están conectados al dispositivo durante un período corto 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 se adopte se considera portátil. Debido a que el almacenamiento portátil está conectado por poco tiempo, la plataforma evita operaciones pesadas como el escaneo de medios. Las aplicaciones de terceros deben pasar por Storage Access Framework para interactuar con los archivos en el almacenamiento portátil; el acceso directo está explícitamente bloqueado por motivos de privacidad y seguridad.