14 votos

¿Cómo detener que las aplicaciones escriban en la carpeta "Android" de la tarjeta SD?

Tengo una pregunta (aparentemente) simple para la que no he encontrado una respuesta clara. Mi teléfono crea una carpeta "Android" en mi tarjeta SD y me pregunto si se podría mover al almacenamiento interno del teléfono en su lugar.

Acabo de conseguir un teléfono nuevo y tiene mucho más almacenamiento que mi teléfono anterior, así que me gustaría aprovechar al máximo todo lo que pueda, por lo que preferiría que todos los datos de la aplicación estén en el almacenamiento interno en lugar de en la tarjeta SD.

Así es como funcionaba en mi antiguo teléfono, así que estoy un poco desconcertado de que no parezca tan fácil de hacerlo ahora.

2 votos

Me temo que no funcionará tan simple como eso, especialmente para archivos OBB (archivos de expansión), ya que por defecto se encuentran ubicados en la ubicación de almacenamiento compartido del sistema (es decir, almacenamiento "externo"). Ten en cuenta que en algunos dispositivos que no tienen ranura para tarjeta SD, el almacenamiento "externo" se emula en el almacenamiento interno.

22voto

Jack Wade Puntos 231

Las aplicaciones normalmente no escriben datos en la tarjeta SD externa, pero a partir de Android 4.4 hasta la última versión 10, no hay permiso para impedir que las aplicaciones escriban en Android directorio en el almacenamiento externo. La razón es más histórica que técnica.


Viaje de almacenamiento de Android:

Android proporciona dos tipos de almacenamiento a las aplicaciones: privado (o interno) y compartido (o externa). Como su nombre indica, los directorios privados de cada aplicación (en /data/data/ ) no son accesibles para otras aplicaciones, pero los datos colocados en el almacenamiento compartido sí lo son.

Almacenamiento externo solía ser físicamente una tarjeta SD externa (con un sistema de archivos sin permisos de la familia FAT) en los primeros días, cuando el almacenamiento flash era costoso. Así que las aplicaciones solían colocar una gran cantidad de datos en la tarjeta SD externa.

Android ha hecho que se aplique WRITE_EXTERNAL_STORAGE ya en 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 OEMs crearon una partición separada (normalmente llamada sdcard ) "para proporcionar almacenamiento externo internamente" . Ahora había dos almacenamientos externos: principal ( sdcard partición) y secundario (tarjeta SD externa). Como el almacenamiento externo primario era todavía más pequeño, las aplicaciones siguieron utilizando ampliamente el almacenamiento secundario colocando los archivos donde querían, creando directorios aleatorios en ambos almacenamientos.

En Android 2.3 FUSE fue introdujo para emular el almacenamiento externo primario ( /sdcard ) sobre el sistema de archivos real de sdcard partición que mayoritariamente seguía siendo vFAT. Pero la intención principal era mantener un sistema de archivos virtual sin permisos (como FAT) sobre un sistema de archivos Linux con permisos (como ext4 ) para que los datos puedan ser compartidos entre aplicaciones (UIDs).

Android 3.1 cambió el almacenamiento masivo USB (UMS) por el protocolo de transferencia de medios (MTP). Esto significa que sdcard o la tarjeta SD externa no se montó como partición cuando se conectó al PC. Así que el contenido real del sistema de archivos no es visible a través de MTP, en su lugar MediaStore (uno de los proveedores de contenido integrados en Android) proporciona una lista indexada de archivos. También las aplicaciones pueden hacer uso de este proveedor de contenidos. Vea los detalles en esta respuesta .

A partir de Android 3.2 la posibilidad de escribir en la tarjeta SD externa estaba restringida sólo a las aplicaciones del sistema (utilizando WRITE_MEDIA_STORAGE permiso). Ver detalles en ¿Cómo mover los archivos a la tarjeta SD externa? . En los dispositivos rooteados esta restricción es hackeada por cartografía GID media_rw (1023) al permiso WRITE_EXTERNAL_SRORAGE.

Para el lanzamiento de Android 4.0 (comenzó con la 3.0) los OEMs comenzaron a emular /data/media en /sdcard como almacenamiento externo primario que eliminó sdcard partición. Esto no era posible con UMS porque /data no se pudo desmontar de Android para montarlo en el PC. Esto es cierto hasta la fecha.

Android 4.3 fusionó múltiples fstab s utilizados anteriormente a un único /fstab.<device> y ha introducido voldmanaged bandera para que los sistemas de archivos externos sean montados por vold . Con el soporte de Treble en Android 8, fstab se trasladó a vendor y en la DTB. Véase ¿Qué es el archivo "fstab" por defecto en Android?

En Android 4.4 al hacer uso de los permisos sintetizados basados en FUSE, las aplicaciones podían escribir en su "directorios privados" (en el interior Android/{data,media,obb}/ directorios) en "almacenamiento compartido" sin solicitar el permiso de Almacenamiento. Hizo posible oficialmente que las aplicaciones utilizaran almacenamiento externo múltiple (primaria y secundaria). También READ|WRITE_EXTERNAL_STORAGE era necesario para leer el almacenamiento externo, incluyendo los directorios privados de otras aplicaciones.

Marco de acceso al almacenamiento ( SAF ) se introdujo para permitir que las aplicaciones no relacionadas con el sistema escriban en la tarjeta SD y se detuvo estrictamente el acceso de escritura directa al almacenamiento externo secundario. Así que ahora era se ha aclarado que almacenamiento externo no siempre es almacenamiento extraíble El primero podría ser físicamente interno. Almacenamiento transitorio como el USB se suma a estos.


Pasando a su pregunta:

Prefiero que todos los datos de las aplicaciones estén en el almacenamiento interno y no en la tarjeta SD.

Las aplicaciones de terceros no pueden escribir directamente en los directorios públicos del almacenamiento externo secundario, pero no se puede impedir que escriban en sus directorios privados ( 1 , [2](https://developer.android.com/reference/android/content/Context.html#getExternalCacheDirs()) , [3](https://developer.android.com/reference/android/content/Context.html#getObbDirs()) , [4](https://developer.android.com/reference/android/content/Context.html#getExternalMediaDirs()) ) Gracias a permisos sintetizados basados en la estructura de directorios :

_"El WRITE_EXTERNAL_STORAGE sólo debe conceder acceso de escritura al almacenamiento externo primario de un dispositivo. No se debe permitir que las aplicaciones escriban en los dispositivos de almacenamiento externo secundario, excepto en los directorios específicos de su paquete, según lo permitan los permisos sintetizados. Restringir las escrituras de este modo garantiza que el sistema pueda limpiar los archivos cuando se desinstalan las aplicaciones"._

Y:

_"A partir de Android 4.4, el propietario, el grupo y los modos de los archivos de los dispositivos de almacenamiento externo se sintetizan ahora en función de la estructura de directorios. Esto permite a las aplicaciones gestionar los directorios específicos de sus paquetes en el almacenamiento externo sin necesidad de que tengan la amplia WRITE_EXTERNAL_STORAGE permiso. Por ejemplo, la aplicación con 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 consiguen envolviendo los dispositivos de almacenamiento en bruto en un demonio FUSE"._

Al acceder / crear sus directorios privados, las aplicaciones confirman si el almacenamiento externo secundario está disponible. Así que en la mayoría de los casos los directorios bajo Android en la tarjeta SD están vacíos, o los archivos son una copia de los del almacenamiento externo primario. Aunque no tiene sentido la mayoría de las veces, pero algunos desarrolladores de aplicaciones pueden preferir guardar los datos en el almacenamiento externo secundario, depende de su voluntad. Por ejemplo, para ampliar rápidamente los archivos de vídeo sin procesar o los grandes OBB como menciona Andrew en el comentario. Android's sugerencia :

"... el dispositivo tiene dos directorios de almacenamiento externo diferentes, por lo que es necesario seleccionar cuál se utilizará cuando se escriban archivos "privados" en el almacenamiento externo.
...
La primera entrada ... es ... el almacenamiento externo primario, y deberías usar esa ubicación a menos que esté llena o no esté disponible".

Y el otro :

"Una aplicación puede almacenar datos en cualquiera de los dispositivos devueltos o en todos ellos. Por ejemplo, una app puede optar por almacenar archivos grandes en el dispositivo con más espacio disponible"

Dado que los directorios privados, tanto en el almacenamiento externo como en el interno, se eliminan al desinstalar la aplicación, el almacenamiento preferido por las aplicaciones para guardar datos persistentes (como fotos) es el almacenamiento público externo primario. Esta norma sigue vigente hasta la fecha. Por lo tanto, suele ser seguro eliminar Android y otros directorios vacíos (algunas versiones de Android también crean directorios estándar ) en la tarjeta SD externa, pero estos se volverían a crear.


EL VIAJE DE ALMACENAMIENTO CONTINÚA...

SAF (selector de archivos) se amplió en Android 5 (para Selección de directorios ) y luego en el 7 (a Acceso al directorio con alcance ). Android 10 lo amplió a Acceso al almacenamiento externo con alcance eliminando por completo el acceso a nivel de sistema de archivos al almacenamiento externo primario, sustituyéndolo por las API del sistema de archivos.

Android 6 introdujo el Almacenamiento Adoptable para utilizar la tarjeta SD como almacenamiento externo primario encriptándola ( vold bandera en fstab : encryptable=userdata ). Ahora incluso las aplicaciones y sus datos en el almacenamiento interno se pueden mover al almacenamiento adoptable. Ver ¿Cómo mover aplicaciones del almacenamiento interno al externo? Esto lo conseguían antes los OEM y los desarrolladores de ROMs personalizadas aplicando parches como "Disco de escritura por defecto" o "Desactivar la memoria interna" a AOSP. Aplicaciones como "Link2SD" también llenó el vacío en los dispositivos rooteados.

Además, la configuración del almacenamiento ( storage.xml ) fue eliminado de framework-res.apk y se fusionó con fstab . Se introdujo la ruta de montaje basada en UUID.
Además, muchos de los permisos de instalación fueron cambiados a permisos de ejecución y para hacer WRITE_EXTERNAL_STORAGE un permiso de ejecución, se utilizaron espacios de nombres de montaje. Para más detalles, véase ¿Qué es el UID "u#_everybody"? y ¿Qué es /storage/emulated/0/?

FUSE fue eliminado completamente en Android 9. sdcardfs se utiliza ahora para la emulación. Leer la historia completa aquí .

3 votos

La jornada continúa aún: SDCardFS está obsoleto/a desde Android 11.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X