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 puede proporcionarse mediante medios físicos, como una tarjeta SD o USB, que es para la transferencia temporal de datos/almacenamiento de archivos. Los medios físicos pueden permanecer con el dispositivo durante un período prolongado de tiempo, pero no están vinculados al dispositivo y pueden eliminarse. Las tarjetas SD han estado disponibles como almacenamiento portátil desde Android 1.0; Android 6.0 agregó compatibilidad con USB. El almacenamiento emulado se proporciona al exponer 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á encriptada y formateada 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 los dispositivos de almacenamiento externo ahora se sintetizan según la estructura del directorio. Esto permite que las aplicaciones administren sus directorios específicos de paquetes en el almacenamiento externo sin necesidad de que tengan el permiso amplio WRITE_EXTERNAL_STORAGE . Por ejemplo, la aplicación 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 envolviendo dispositivos de almacenamiento sin formato en un demonio FUSE.

A partir de Android 10, las aplicaciones que tienen como objetivo Android 9 y versiones inferiores al almacenamiento heredado de forma predeterminada, pueden optar por el almacenamiento aislado. Las aplicaciones que tienen como objetivo Android 10 y el almacenamiento aislado predeterminado pueden optar por no hacerlo 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 por software, si el instalador no incluyó la aplicación en la lista blanca, el permiso controla el acceso solo a las colecciones auditivas y visuales, sin acceso a la tarjeta SD. Esto se aplica incluso si la aplicación solicita almacenamiento heredado. Para obtener más información sobre las restricciones duras y las restricciones blandas, consulte Restricciones duras y blandas 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 del permiso no aislado. El permiso controla el acceso a la tarjeta SD y las colecciones auditivas y visuales. Esto sucede cuando la aplicación tiene como objetivo Android 9 o versiones anteriores y no opta por el almacenamiento aislado, o cuando tiene como objetivo Android 10 y opta por no hacerlo.

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 .

Permisos de tiempo de ejecución

Android 6.0 presenta un nuevo modelo de permisos de tiempo de ejecución en el que las aplicaciones solicitan capacidades cuando es necesario en tiempo de ejecución. Debido a que el nuevo modelo incluye los permisos READ/WRITE_EXTERNAL_STORAGE , la plataforma debe otorgar acceso de almacenamiento de forma dinámica sin eliminar o reiniciar las aplicaciones que ya se están ejecutando. Lo hace manteniendo tres vistas distintas de todos los dispositivos de almacenamiento montados:

  • /mnt/runtime/default se muestra a las aplicaciones sin permisos especiales de almacenamiento y al espacio de nombres raíz donde adbd y otros componentes del sistema.
  • /mnt/runtime/read se muestra a las aplicaciones con READ_EXTERNAL_STORAGE (establecer LEGACY_STORAGE para Android 10)
  • /mnt/runtime/write se muestra a las 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 enlazamos el montaje con la vista inicial adecuada en su lugar. Más tarde, cuando se otorgan los 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 resultan en 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 retroalimentado con éxito a Linux 3.4. La prueba CTS de PermissionsHostTest se puede usar para verificar el comportamiento correcto del kernel.