14 votes

Comment empêcher les applications d'écrire dans le dossier "Android" de la carte SD ?

J'ai une question (apparemment) simple à laquelle je n'ai pas trouvé de réponse claire. Mon téléphone crée un dossier "Android" sur ma carte SD et je me demande s'il ne pourrait pas être déplacé dans le stockage interne du téléphone.

Je viens d'acheter un nouveau téléphone et il dispose de beaucoup plus d'espace de stockage que le précédent. J'aimerais donc en tirer le meilleur parti possible et je préférerais que toutes les données des applications se trouvent sur le stockage interne plutôt que sur la carte SD.

C'est comme ça que ça fonctionnait sur mon ancien téléphone, je suis donc un peu étonné que ça ne semble plus aussi facile à faire.

2 votes

Je crains que cela ne fonctionne pas aussi simplement que cela, en particulier pour les Fichiers OBB (fichiers d'extension) puisqu'il se trouve par défaut sur l'emplacement de stockage partagé du système (c'est-à-dire le stockage "externe"). Notez que sur certains appareils qui n'ont pas d'emplacement pour carte SD, le stockage "externe" est émulé dans le stockage interne.

22voto

Irfan Latif Points 16863

Les applications n'écrivent généralement pas de données sur la carte SD externe, mais depuis Android 4.4 jusqu'à la dernière version 10, il n'est pas possible d'empêcher les applications d'écrire sur la carte SD externe. Android sur un support externe. La raison est plus historique que technique.


Android'S STORAGE JOURNEY :

Android fournit deux types de stockage aux applications : privé (ou interne) et partagé (ou externe). Comme leur nom l'indique, les répertoires privés de chaque application (en /data/data/ ) ne sont pas accessibles aux autres applications, mais les données placées sur un stockage partagé le sont.

Stockage externe était physiquement une carte SD externe (avec un système de fichiers sans permission de la famille FAT) à l'époque où le stockage flash était coûteux. Les applications avaient donc l'habitude de placer beaucoup de données sur la carte SD externe.

Android appliqué ÉCRITURE_MÉMOIRE_EXTERNE dès la version 1.5 d'Android pour contrôler quelles applications pouvaient écrire sur le stockage externe, de sorte que presque toutes les applications devaient demander cette autorisation.

Au fur et à mesure que la mémoire flash interne augmentait en taille, les OEM ont créé une partition séparée (généralement appelée sdcard ) "pour fournir un stockage externe en interne" . Maintenant il y avait deux stockages externes : primaire ( sdcard partition) et secondaire (carte SD externe). Le stockage externe primaire étant encore plus petit, les applications ont continué à utiliser largement le stockage secondaire en plaçant les fichiers où elles le souhaitaient, créant ainsi des répertoires aléatoires sur les deux types de stockage.

Dans Android 2.3, FUSE était introduit pour émuler le stockage externe primaire ( /sdcard ) sur le système de fichiers actuel de sdcard partition qui reste principalement vFAT. Mais l'intention première était de conserver un système de fichiers virtuel sans permission (comme la FAT) plutôt qu'un système de fichiers Linux avec permission (comme la vFAT). ext4 ) afin que les données puissent être partagées entre les applications (UID).

Android 3.1 a remplacé le stockage de masse USB (UMS) par le protocole de transfert de médias (MTP). Cela signifie que sdcard ou la carte SD externe n'a pas été montée en tant que partition lors de la connexion au PC. Ainsi, le contenu réel du système de fichiers n'est pas visible sur le MTP, mais plutôt MediaStore (l'un des fournisseurs de contenu intégrés à Android) fournit une liste indexée de fichiers. Les applications peuvent également utiliser ce fournisseur de contenu. Voir les détails dans cette réponse .

À partir d'Android 3.2, la possibilité d'écrire sur la carte SD externe était limitée aux seules applications système (en utilisant les fonctions WRITE_MEDIA_STORAGE permission). Voir les détails dans Comment déplacer des fichiers vers une carte SD externe ? . Sur les appareils enracinés, cette restriction est contournée en cartographie GID media_rw (1023) à la permission WRITE_EXTERNAL_SRORAGE.

Avec la sortie d'Android 4.0 (qui a commencé avec 3.0), les OEM ont commencé à émuler /data/media en /sdcard como stockage externe primaire qui a éliminé sdcard partition. Cela n'était pas possible avec UMS car /data n'a pas pu être démonté d'Android pour être monté sur le PC. Ceci est vrai jusqu'à aujourd'hui.

Android 4.3 fusionné multiple fstab utilisés précédemment à un seul /fstab.<device> et a introduit voldmanaged drapeau pour les systèmes de fichiers externes à monter par vold . Avec le support de Treble dans Android 8, fstab a été déplacé vers vendor et dans DTB. Voir Quel est le fichier "fstab" par défaut dans Android ?

Dans Android 4.4, grâce à l'utilisation de permissions synthétisées basées sur FUSE, les applications étaient autorisées à écrire dans leurs fichiers de données. "répertoires privés" (à l'intérieur Android/{data,media,obb}/ répertoires) sur le "stockage partagé" sans demander l'autorisation de stockage. Il est désormais officiellement possible pour les applications d'utiliser stockage externe multiple (primaire et secondaire). Voir aussi READ|WRITE_EXTERNAL_STORAGE était nécessairement nécessaire pour lire le stockage externe, y compris les répertoires privés des autres applications.

Cadre d'accès au stockage ( SAF ) a été introduit pour permettre aux applications non système d'écrire sur la carte SD et l'accès direct en écriture au stockage externe secondaire a été strictement arrêté. Donc maintenant c'est claire que stockage externe n'est pas toujours stockage amovible le premier pourrait être physiquement interne. Stockage transitoire comme l'USB s'ajoute à ceux-ci.


Pour en venir à votre question :

Je préférerais que toutes les données de l'application se trouvent sur le stockage interne plutôt que sur la carte SD.

Les applications tierces ne peuvent pas écrire directement dans les répertoires publics du stockage externe secondaire, mais on ne peut pas les empêcher d'écrire dans leurs répertoires privés. ( 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()) ) grâce à permissions synthétisées basées sur la structure du répertoire :

_" Le WRITE_EXTERNAL_STORAGE L'autorisation ne doit accorder qu'un accès en écriture au stockage externe primaire d'un appareil. Les applications ne doivent pas être autorisées à écrire sur les périphériques de stockage externes secondaires, sauf dans les répertoires spécifiques à leur pack, comme le permettent les autorisations synthétisées. Restreindre les écritures de cette manière permet au système de nettoyer les fichiers lorsque les applications sont désinstallées."_

Et :

_"À partir d'Android 4.4, le propriétaire, le groupe et les modes des fichiers sur les périphériques de stockage externes sont désormais synthétisés en fonction de la structure des répertoires. Cela permet aux applications de gérer les répertoires spécifiques à leur paquet sur le stockage externe sans qu'elles aient besoin de détenir le vaste répertoire de l'application. WRITE_EXTERNAL_STORAGE permission. Par exemple, l'application avec le nom de paquet com.example.foo peuvent désormais accéder librement Android/data/com.example.foo/ sur des périphériques de stockage externes sans autorisation. Ces permissions synthétisées sont réalisées en enveloppant les périphériques de stockage bruts dans un démon FUSE."_

En accédant à / créant leurs répertoires privés, les applications confirment si le stockage externe secondaire est disponible. Ainsi, dans la plupart des cas, les répertoires sous Android sur la carte SD sont soit vides, soit les fichiers sont une copie de ceux du stockage externe primaire. Bien que cela n'ait pas de sens la plupart du temps, certains développeurs d'applications peuvent préférer sauvegarder les données sur le stockage externe secondaire, c'est à eux de décider. Par exemple, pour développer rapidement des fichiers vidéo bruts ou des fichiers volumineux, les développeurs d'applications peuvent préférer sauvegarder les données sur le stockage externe secondaire. OBB comme mentionné par Andrew en commentaire. Android suggestion :

"... l'appareil possède deux répertoires de stockage externe différents, vous devez donc sélectionner celui à utiliser lorsque vous écrivez des fichiers "privés" sur le stockage externe.
...
La première entrée ... est ... le stockage externe primaire, et vous devez utiliser cet emplacement à moins qu'il ne soit plein ou indisponible. "

Et le l'autre :

" Une application peut stocker des données sur l'un ou l'ensemble des dispositifs retournés. Par exemple, une application peut choisir de stocker des fichiers volumineux sur l'appareil ayant le plus d'espace disponible. "

Étant donné que les répertoires privés sur le stockage externe et interne sont supprimés lors de la désinstallation de l'application, le stockage préféré des applications pour stocker les données persistantes (comme les photos) est le stockage public externe primaire. Cette norme perdure jusqu'à aujourd'hui. Par conséquent, il est généralement sûr de supprimer Android et d'autres répertoires vides (certaines versions d'Android créent également des répertoires répertoires standard ) sur la carte SD externe mais ils seront recréés.


LE VOYAGE DU STOCKAGE SE POURSUIT...

SAF (sélecteur de fichiers) a été étendu dans Android 5 (pour Sélection de l'annuaire ) et ensuite en 7 (vers Accès aux répertoires à portée étendue ). Android 10 l'a encore étendu à Accès au stockage externe supprimer entièrement l'accès au niveau du système de fichiers au stockage externe primaire et le remplacer par des API de système de fichiers.

Android 6 a introduit Adoptable Storage pour utiliser la carte SD comme stockage externe principal en la chiffrant ( vold le drapeau en fstab : encryptable=userdata ). Désormais, même les applications et leurs données sur le stockage interne peuvent être déplacées vers le stockage adoptable. Voir Comment déplacer des applications du stockage interne au stockage externe ? Auparavant, les équipementiers et les développeurs de ROM personnalisées y parvenaient en appliquant des correctifs tels que "Disque d'écriture par défaut" o "Désactiver la mémoire interne" à l'AOSP. Des applications comme "Link2SD" a également comblé le vide sur les appareils enracinés.

En outre, la configuration du stockage ( storage.xml ) a été retiré de framework-res.apk et fusionné à fstab . Le chemin de montage basé sur UUID a été introduit.
De plus, de nombreuses permissions d'installation ont été déplacées vers des permissions d'exécution et afin de rendre WRITE_EXTERNAL_STORAGE une permission d'exécution, les espaces de noms de montage ont été utilisés. Pour plus de détails, voir Qu'est-ce que l'UID "u#_everybody" ? y Qu'est-ce que /storage/emulated/0/ ?

FUSE était supprimé complètement dans Android 9. sdcardfs est maintenant utilisé pour l'émulation. Lire toute l'histoire aquí .

3 votes

Le voyage continue : SDCardFS est obsolète depuis Android 11.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X