
Android admite dispositivos con almacenamiento tradicional, que se define como un sistema de archivos que no distingue mayúsculas de minúsculas con clases y modos de permisos inmutables de POSIX. El concepto de almacenamiento tradicional abarca el almacenamiento emulado y portátil. El almacenamiento portátil se define como cualquier almacenamiento externo que el sistema no adopte y, por lo tanto, no esté formateado ni encriptado, ni vinculado a un dispositivo específico. Dado que el almacenamiento externo tradicional ofrece una protección mínima para los datos almacenados, el código del sistema no debe almacenar datos sensibles en el almacenamiento externo. Específicamente, los archivos de configuración y registro solo deben almacenarse en el almacenamiento interno, donde se pueden proteger de manera eficaz.
Almacenamiento externo multiusuario
A partir de Android 4.2, los dispositivos pueden admitir varios usuarios, y el almacenamiento externo debe cumplir con las siguientes restricciones:
- Cada usuario debe tener su propio almacenamiento externo principal aislado y no debe tener acceso al almacenamiento externo principal de otros usuarios.
- La ruta de acceso
/sdcard
debe resolverse en el almacenamiento externo principal correcto y específico del usuario según el usuario como 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 apps no deben poder escribir en el almacenamiento externo secundario, excepto en directorios específicos del paquete, como lo permiten los permisos sintetizados.
La implementación predeterminada de la plataforma de esta función aprovecha los espacios de nombres del kernel de Linux para crear tablas de activación aisladas para cada proceso bifurcado de Zygote y, luego, usa activaciones de vinculación para ofrecer el almacenamiento externo primario específico del usuario correcto en ese espacio de nombres privado.
Durante el inicio, el sistema activa un único daemon de FUSE de almacenamiento externo emulado en EMULATED_STORAGE_SOURCE
, que está oculto para las apps. Después de que Zygote se bifurca, vincula y activa el subdirectorio específico del usuario apropiado desde el daemon de FUSE a EMULATED_STORAGE_TARGET
para que las rutas de acceso de almacenamiento externo se resuelvan correctamente para la app. Como una app carece de puntos de activación accesibles para el almacenamiento de otros usuarios, solo puede acceder al almacenamiento del usuario con el que se inició.
Esta implementación también usa la función de kernel de subárbol compartido para propagar eventos de activación desde el espacio de nombres raíz predeterminado a los espacios de nombres de la app, lo que garantiza que funciones como los contenedores de ASEC y la activación de OBB sigan funcionando correctamente. Para ello, activa el sistema de archivos raíz como compartido y, luego, vuelve a activarlo como esclavo después de que se crea cada espacio de nombres de Zygote.
Varios 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()
.
El permiso WRITE_EXTERNAL_STORAGE
solo debe otorgar acceso de escritura al almacenamiento externo principal de un dispositivo. No se debe permitir que las apps escriban en dispositivos de almacenamiento externo secundarios, excepto en sus directorios específicos del paquete, según lo permitan los permisos sintetizados. Restringir las operaciones de escritura de esta manera garantiza que el sistema pueda limpiar los archivos cuando se desinstalan las aplicaciones.
Compatibilidad con contenido multimedia USB
Android 6.0 admite dispositivos de almacenamiento portátiles que solo se conectan al dispositivo por un período breve, como las unidades de memoria flash USB. Cuando un usuario inserta un dispositivo portátil nuevo, 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 se conecta solo por un período breve, la plataforma evita operaciones pesadas, como el análisis de contenido multimedia. Las apps de terceros deben pasar por el framework de acceso al almacenamiento para interactuar con los archivos del almacenamiento portátil. El acceso directo se bloquea de forma explícita por motivos de privacidad y seguridad.