Las aplicaciones generalmente no escriben datos en la tarjeta SD externa, pero desde Android 4.4 hasta la última versión 10, no hay permiso para detener la escritura de aplicaciones en el directorio Android
en el almacenamiento externo. El motivo es más histórico que técnico.
VIAJE DE ALMACENAMIENTO DE ANDROID:
Android proporciona dos tipos de almacenamiento para las aplicaciones: privado (o interno) y compartido (o externo). Como sugieren los nombres, los directorios privados de cada aplicación (en / data / data /
) no son accesibles para otras aplicaciones, pero los datos almacenados en el almacenamiento compartido sí lo son.
El almacenamiento externo solía ser una tarjeta SD físicamente externa (con un sistema de archivos sin permiso de la familia FAT) en los primeros días cuando el almacenamiento flash era costoso. Entonces, las aplicaciones solían colocar una gran cantidad de datos en la tarjeta SD externa.
Android impuso el permiso WRITE_EXTERNAL_STORAGE desde Android 1.5 para controlar qué aplicaciones podían escribir en el almacenamiento externo, por lo que casi todas las aplicaciones tenían que solicitar este permiso.
A medida que la memoria flash interna crecía en tamaño, los fabricantes de equipos originales crearon una partición separada (generalmente llamada sdcard
) "para proporcionar almacenamiento externo interno " . Ahora había dos almacenamiento externo: primario (partición sdcard
) y secundario (tarjeta SD externa). Dado que el almacenamiento externo primario era aún más pequeño, las aplicaciones continuaron utilizando ampliamente el almacenamiento secundario colocando archivos donde quisieran, creando directorios aleatorios en ambos dispositivos de almacenamiento.
En Android 2.3, FUSE se introdujo a emular el almacenamiento externo primario ( / sdcard
) sobre el sistema de archivos real de la partición sdcard
que en su mayoría permaneció como vFAT. Pero la intención principal era retener un sistema de archivos virtual sin permisos (como FAT) sobre un sistema de archivos Linux con permiso (como ext4
) para que los datos pudieran compartirse entre aplicaciones (UID).
Android 3.1 cambió el almacenamiento masivo USB (UMS) al protocolo de transferencia de medios (MTP). Significa que la partición sdcard
o la tarjeta SD externa no se montó como partición cuando se conectó a la PC. Por lo tanto, el contenido real del sistema de archivos no es visible en MTP, en su lugar, MediaStore (uno de los proveedores de contenido integrados de Android) proporciona una lista indexada de archivos. Además, las aplicaciones pueden hacer uso de este proveedor de contenido. Consulte los detalles en esta respuesta.
A partir de las aplicaciones de Android 3.2, la capacidad de escritura en la tarjeta SD externa estaba restringida solo a las aplicaciones del sistema (con el permiso WRITE_MEDIA_STORAGE
) . Consulte los detalles en ¿Cómo mover archivos a una tarjeta SD externa?. En dispositivos rooteados, esta restricción es pirateada al mapear GID media_rw (1023)
al permiso WRITE_EXTERNAL_SRORAGE.
Con el lanzamiento de Android 4.0 (comenzó con 3.0) Los OEM comenzaron a emular / data / media
en / sdcard
como almacenamiento externo primario , lo que eliminó la partición sdcard
. Esto no fue posible con UMS porque / data
no se pudo desmontar de Android para montarlo en la PC. Esto es cierto hasta la fecha.
Android 4.3 fusionó varios fstab
utilizados anteriormente en un solo archivo /fstab.<device>
e introdujo voldmanaged
flag para que los sistemas de archivos externos sean montados por vold
. Con la compatibilidad con Treble en Android 8, fstab
se movió a la partición vendor
y en DTB. Consulte ¿Qué es el archivo "fstab" predeterminado en Android?
En Android 4.4, haciendo uso de permisos sintetizados basados en FUSE, las aplicaciones podían escribir en sus "directorios privados" (dentro de Android / {data, media, obb} /
directorios) en "almacenamiento compartido" sin solicitar permiso de almacenamiento. Hizo que fuera oficialmente posible que las aplicaciones usaran múltiples almacenamiento externo (primario y secundario). También se requería READ | WRITE_EXTERNAL_STORAGE
para leer el almacenamiento externo, incluidos los directorios privados de otras aplicaciones.
Storage Access Framework ( SAF) se introdujo para permitir las aplicaciones que no pertenecen al sistema escriben en la tarjeta SD y el acceso de escritura directo al almacenamiento externo secundario se detuvo estrictamente. Así que ahora se dejó en claro que el almacenamiento externo no siempre es almacenamiento extraíble , el primero podría ser físicamente interno. Almacenamiento transitorio como USB se suma a estos.
Llegando a su pregunta:
I Preferiría que todos los datos de la aplicación estén en el almacenamiento interno en lugar de en la tarjeta SD.
Las aplicaciones de terceros no pueden escribir directamente en directorios públicos en el almacenamiento externo secundario, pero no se pueden detener desde escribiendo en sus directorios privados ( 1, 2, 3, 4) , gracias a permisos sintetizados basados en la estructura del directorio:
"El permiso WRITE_EXTERNAL_STORAGE
solo debe otorgar acceso de escritura al almacenamiento externo primario en un dispositivo. No se debe permitir que las aplicaciones escriban en dispositivos de almacenamiento externos secundarios, excepto en sus directorios específicos del paquete, según lo permitan los permisos sintetizados. Restringir la escritura de esta manera garantiza que el sistema pueda limpiar archivos cuando se desinstalan las aplicaciones. "
Y:
"A partir de Android 4.4, el propietario, el grupo y los modos de los archivos en los dispositivos de almacenamiento externos ahora se sintetizan en función de la estructura de directorios. Esto permite que las aplicaciones administren sus directorios específicos de paquetes en el almacenamiento externo sin necesidad de que tengan el permiso de WRITE_EXTERNAL_STORAGE
amplio. 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 externos sin permisos. Estos permisos sintetizados se logran envolviendo los dispositivos de almacenamiento sin procesar en un demonio FUSE. "
Accediendo / creando sus directorios privados, aplicaciones confirme si el almacenamiento externo secundario está disponible. Por tanto, en la mayoría de los casos, los directorios del directorio Android
de la tarjeta SD están vacíos o los archivos son una copia de los del almacenamiento externo principal. Aunque la mayoría de las veces no tiene sentido, algunos desarrolladores de aplicaciones pueden preferir guardar datos en un almacenamiento externo secundario, depende de su voluntad. P.ej. para expandir rápidamente archivos de video sin procesar o archivos grandes OBB como lo menciona Andrew en el comentario. sugerencia de Android:
"... el dispositivo tiene dos directorios de almacenamiento externo diferentes, por lo que debe seleccionar cuál usar al escribir" privado " archivos al almacenamiento externo.
...
La primera entrada ... es ... el almacenamiento externo primario, y debes usar esa ubicación a menos que esté llena o no esté disponible ".
Y el otro:
"Una aplicación puede almacenar datos en cualquiera o todos los dispositivos devueltos. Por ejemplo , una aplicación puede optar por almacenar archivos grandes en el dispositivo con más espacio disponible "
Dado que los directorios privados en el almacenamiento externo e interno se eliminan al desinstalar la aplicación, el almacenamiento preferido para que las aplicaciones almacenen datos persistentes (como fotos) es el almacenamiento público externo primario. Esta norma continúa hasta la fecha. Por lo tanto, generalmente es seguro eliminar Android
y otros directorios vacíos (algunas versiones de Android también crean directorios estándar) en la tarjeta SD externa, pero se volverían a crear.
CONTINUACIÓN DEL VIAJE DE ALMACENAMIENTO ...
SAF (selector de archivos) se extendió en Android 5 (para Selección de directorio) y luego en 7 (a Acceso al directorio con ámbito). Android 10 lo amplió aún más a Acceso de almacenamiento externo con alcance, eliminando por completo el acceso a nivel de sistema de archivos al almacenamiento externo primario también, reemplazándolo con API del sistema de archivos.
Android 6 introdujo Adoptable Storage para usar la tarjeta SD como almacenamiento externo primario cifrándolo (marca vold
en fstab
: encryptable = userdata
). Ahora incluso las aplicaciones y sus datos en el almacenamiento interno se pueden mover a un almacenamiento adoptable. Consulte ¿Cómo mover aplicaciones del almacenamiento interno al externo?. Esto lo lograban previamente los OEM y los desarrolladores de ROM personalizados mediante la aplicación de parches como "Disco de escritura predeterminado" o "Desactivar Memoria interna " a AOSP. Aplicaciones como "Link2SD" también llenaron el vacío en los dispositivos rooteados.
Además, la configuración de almacenamiento ( storage.xml
) se eliminó del marco de res.apk
y se fusionó con fstab
. Se introdujo la ruta de montaje basada en UUID.
También muchos permisos de tiempo de instalación se cambiaron a permisos de tiempo de ejecución y para hacer que WRITE_EXTERNAL_STORAGE
sea un permiso de tiempo de ejecución, se utilizaron espacios de nombres de montaje. Para obtener más información, consulte ¿Qué es el UID "u # _everybody"? y ¿Qué es / storage / emulated / 0 /?
FUSE fue eliminado por completo en Android 9. sdcardfs
ahora se usa para la emulación. Lea la historia completa aquí.