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í .
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.