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, encriptado 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 registro solo deben almacenarse en el 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 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 /sdcard debe resolverse en el almacenamiento externo principal específico del usuario correcto en función del usuario con el que se ejecuta un proceso.
  • El almacenamiento de archivos OBB grandes en el directorio Android/obb puede compartirse 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 solo demonio FUSE de almacenamiento externo emulado en EMULATED_STORAGE_SOURCE , que está oculto para las aplicaciones. Después de las bifurcaciones de Zygote, enlaza monta el subdirectorio específico del usuario adecuado desde 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 usa la función de núcleo 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 continúen funcionando correctamente. Para ello, monta 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 el compartimento de la 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 mostrarse a través de estas API.

El permiso WRITE_EXTERNAL_STORAGE solo debe otorgar acceso de escritura al almacenamiento externo principal en un dispositivo. No se debe permitir que las aplicaciones escriban en dispositivos de almacenamiento externo secundario, 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 los archivos cuando se desinstalan las aplicaciones.

Soporte de medios USB

Android 6.0 es compatible con dispositivos de almacenamiento portátiles que solo se conectan al dispositivo durante un breve período de tiempo, como unidades flash USB. Cuando un usuario inserta un nuevo dispositivo portátil, la plataforma muestra una notificación para que pueda 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 razones de privacidad y seguridad.