Almacenamiento

Icono HAL de almacenamiento externo de Android

Android ha evolucionado 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 almacenamiento portátil y emulado. El almacenamiento portátil se puede proporcionar mediante medios físicos, como una tarjeta SD o USB, es decir, para la transferencia temporal de datos/almacenamiento de archivos. Los medios físicos pueden permanecer en el dispositivo durante un período prolongado, pero no están vinculados al dispositivo y pueden retirarse. Las tarjetas SD han estado disponibles como almacenamiento portátil desde Android 1.0; Android 6.0 agregó soporte USB. El almacenamiento emulado se proporciona exponiendo una parte del almacenamiento interno a través de una capa de emulación y ha estado disponible desde Android 3.0.

A partir de Android 6.0, Android admite almacenamiento adoptable , que se proporciona mediante medios físicos, como una tarjeta SD o USB, que está cifrado y formateado para comportarse como almacenamiento interno. El almacenamiento adoptable puede almacenar todo tipo de datos de aplicaciones.

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 externos ahora se sintetizan según la estructura de directorios. Esto permite que las aplicaciones administren sus directorios específicos de paquetes en almacenamiento externo sin necesidad de tener el permiso amplio WRITE_EXTERNAL_STORAGE . Por ejemplo, la aplicación con nombre de paquete com.example.foo ahora puede acceder libremente Android/data/com.example.foo/ en dispositivos de almacenamiento externos sin permisos. Estos permisos sintetizados se logran envolviendo dispositivos de almacenamiento sin formato en un demonio FUSE.

A partir de Android 10, las aplicaciones orientadas a Android 9 y versiones anteriores utilizan de forma predeterminada el almacenamiento heredado y pueden optar por el almacenamiento aislado. Las aplicaciones que apuntan a Android 10 y tienen de forma predeterminada almacenamiento aislado pueden optar por no participar temporalmente . Utilice el atributo de manifiesto requestLegacyExternalStorage , que controla el modelo de almacenamiento, para cambiar el estado predeterminado.

Dado que los permisos READ_EXTERNAL_STORAGE y WRITE_EXTERNAL_STORAGE están restringidos temporalmente, si el instalador no incluyó la aplicación en la lista blanca, el permiso controla el acceso a las colecciones auditivas y visuales únicamente, sin acceso a la tarjeta SD. Esto se aplica incluso si la aplicación solicita almacenamiento heredado. Para obtener más información sobre restricciones estrictas y leves, consulte Restricciones estrictas y leves en Android 10 .

Si el instalador incluyó el permiso en la lista blanca, una aplicación 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 auditivas y visuales. Esto sucede cuando la aplicación apunta a Android 9 o versiones anteriores y no opta por el almacenamiento aislado, o cuando apunta a Android 10 y opta por no participar.

El estado de la lista blanca solo se puede especificar en el momento de la instalación y no se puede cambiar hasta que se haya instalado la aplicación.

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

Android 13 introduce permisos multimedia granulares para admitir aplicaciones que acceden a archivos multimedia creados por otras aplicaciones. Las aplicaciones deben solicitar uno o más de los permisos de medios granulares enumerados en Permisos de medios granulares en lugar del permiso READ_EXTERNAL_STORAGE .

Android 14 se basa en permisos de medios granulares para permitir a los usuarios otorgar acceso parcial a su biblioteca de medios visuales cuando las aplicaciones solicitan permisos de medios. Consulte Conceder acceso parcial a fotos y vídeos para obtener más información.

Permisos de tiempo de ejecución

Android 6.0 introduce un nuevo modelo de permisos de tiempo de ejecución donde las aplicaciones solicitan capacidades cuando son necesarias en tiempo de ejecución. Debido a que el nuevo modelo incluye los permisos READ/WRITE_EXTERNAL_STORAGE , la plataforma necesita otorgar acceso al almacenamiento dinámicamente sin cerrar ni reiniciar aplicaciones que ya se están ejecutando. Para ello, mantiene tres vistas distintas de todos los dispositivos de almacenamiento montados:

  • /mnt/runtime/default se muestra a las aplicaciones 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 en aplicaciones con READ_EXTERNAL_STORAGE (establezca LEGACY_STORAGE para Android 10)
  • /mnt/runtime/write se muestra en aplicaciones con WRITE_EXTERNAL_STORAGE

En el momento de la bifurcación de Zygote, creamos un espacio de nombres de montaje para cada aplicación en ejecución y vinculamos el montaje de la vista inicial adecuada en su lugar. Más tarde, cuando se otorgan permisos de tiempo de ejecución, vold salta al espacio de nombres de montaje de las aplicaciones que ya se están ejecutando y bind monta la vista actualizada en su lugar. Tenga en cuenta que las degradaciones de permisos siempre provocan la eliminación de la aplicación.

La funcionalidad setns() utilizada para implementar esta característica requiere al menos Linux 3.8, pero los parches se han adaptado exitosamente a Linux 3.4. La prueba CTS PermissionsHostTest se puede utilizar para verificar el comportamiento correcto del kernel.