Storage

Ícono de HAL de almacenamiento externo de Android

Android evolucionó con el tiempo para admitir una amplia variedad de tipos y funciones de dispositivos de almacenamiento. Todas las versiones de Android admiten dispositivos con almacenamiento tradicional, que incluye el almacenamiento portátil y el emulado. El almacenamiento portátil se puede proporcionar a través de medios físicos, como una tarjeta SD o USB, que se usa para la transferencia de datos o el almacenamiento de archivos temporales. El contenido multimedia físico puede permanecer con el dispositivo por un período prolongado, pero no está vinculado a él y se puede quitar. Las tarjetas SD están disponibles como almacenamiento portátil desde Android 1.0; Android 6.0 agregó compatibilidad con USB. El almacenamiento emulado se proporciona exponiendo una parte del almacenamiento interno a través de una capa de emulación y está disponible a partir de Android 3.0.

A partir de Android 6.0, Android admite el almacenamiento adoptable, que proporciona un medio físico, como una tarjeta SD o USB, que está encriptado y tiene el formato para comportarse como almacenamiento interno. El almacenamiento adoptable puede almacenar todos los tipos de datos de la aplicación.

Permisos

El acceso al almacenamiento externo está protegido por varios permisos de Android. A partir de Android 1.0, el acceso de escritura está protegido con el permiso WRITE_EXTERNAL_STORAGE. A partir de Android 4.1, el acceso de lectura está protegido con el permiso READ_EXTERNAL_STORAGE.

A partir de Android 4.4, el propietario, el grupo y los modos de los archivos en dispositivos de almacenamiento externo ahora se sintetizan en función de la estructura de directorios. Esto permite que las apps administren sus directorios específicos de paquetes en el almacenamiento externo sin necesidad de tener el permiso WRITE_EXTERNAL_STORAGE amplio. Por ejemplo, la app con el nombre de paquete com.example.foo ahora puede acceder libremente a Android/data/com.example.foo/ en dispositivos de almacenamiento externo sin permisos. Estos permisos sintetizados se logran uniendo dispositivos de almacenamiento sin procesar en un daemon de FUSE.

A partir de Android 10, las apps orientadas a Android 9 y versiones anteriores usan el almacenamiento heredado de forma predeterminada y pueden habilitar el almacenamiento aislado. Las apps que se orientan a Android 10 y que usan el almacenamiento aislado de forma predeterminada pueden inhabilitarlo temporalmente. Usa el atributo del manifiesto requestLegacyExternalStorage, que controla el modelo de almacenamiento, para cambiar el estado predeterminado.

Dado que los permisos READ_EXTERNAL_STORAGE y WRITE_EXTERNAL_STORAGE tienen restricciones suaves, si el instalador no incluyó la app en la lista de entidades permitidas, el permiso controla solo el acceso a las colecciones visuales y sonoras, sin acceso a la tarjeta SD. Esto se aplica incluso si la app solicita almacenamiento heredado. Para obtener más información sobre las restricciones estrictas y no estrictas, consulta Restricciones estrictas y flexibles en Android 10.

Si el instalador incluyó el permiso en la lista de entidades permitidas, una app que se ejecuta en modo heredado obtiene el comportamiento de permiso no aislado. El permiso controla el acceso a la tarjeta SD y las colecciones visuales y auditivas. Esto sucede cuando la app se orienta a Android 9 o versiones anteriores y no habilita el almacenamiento aislado, o se orienta a Android 10 e inhabilita el almacenamiento.

El estado de la lista de entidades permitidas solo se puede especificar en el momento de la instalación y no se puede cambiar hasta que se instala la app.

Para obtener más información sobre cómo configurar el permiso READ_EXTERNAL_STORAGE, consulta setWhitelistedRestrictedPermissions() en la clase PackageInstaller.SessionParams.

Android 13 introduce permisos de contenido multimedia detallados para admitir apps que acceden a archivos multimedia creados por otras apps. Las apps deben solicitar uno o más de los permisos de contenido multimedia detallados que se enumeran en Permisos de contenido multimedia detallados en lugar del permiso READ_EXTERNAL_STORAGE.

Android 14 se basa en permisos de contenido multimedia detallados para permitir que los usuarios otorguen acceso parcial a su biblioteca de medios visuales cuando las apps solicitan permisos de contenido multimedia. Consulta Otorga acceso parcial a fotos y videos para obtener más información.

Permisos de tiempo de ejecución

Android 6.0 presenta un nuevo modelo de permisos en tiempo de ejecución en el que las apps solicitan funciones cuando es necesario durante el tiempo de ejecución. Debido a que el nuevo modelo incluye los permisos READ/WRITE_EXTERNAL_STORAGE, la plataforma debe otorgar acceso al almacenamiento de forma dinámica sin finalizar ni reiniciar las apps que ya se están ejecutando. Para ello, mantiene tres vistas distintas de todos los dispositivos de almacenamiento activados:

  • /mnt/runtime/default se muestra a las apps sin permisos de almacenamiento especiales y al espacio de nombres raíz donde se encuentran adbd y otros componentes del sistema.
  • /mnt/runtime/read se muestra a las apps con READ_EXTERNAL_STORAGE (establece LEGACY_STORAGE para Android 10).
  • /mnt/runtime/write se muestra a las apps con WRITE_EXTERNAL_STORAGE

En el momento de la bifurcación de Zygote, creamos un espacio de nombres de activación para cada app en ejecución y vinculamos la activación de la vista inicial adecuada. Más adelante, cuando se otorgan los permisos del tiempo de ejecución, vold salta al espacio de nombres de activación de las apps que ya se están ejecutando y vincula la activación de la vista actualizada. Ten en cuenta que las reducciones de permisos siempre hacen que se cierre la app.

La funcionalidad setns() que se usa para implementar esta función requiere al menos Linux 3.8, pero los parches se portaron correctamente a Linux 3.4. La prueba de CTS de PermissionsHostTest se puede usar para verificar el comportamiento correcto del kernel.