Récemment, je l' ai compris que si je supprime des fichiers depuis /sdcard/Download
qu'il supprime les fichiers de /storage/emulated/0/Download
. Et si j'y ajoute les fichiers, /sdcard/Download
il les duplique /storage/emulated/0/Download
.
Alors c'est quoi /storage/emulated/0/
? À quelles fins l’avons-nous dans notre système de fichiers Android?
/storage/emulated/0/
est réellement/data/media/0/
exposé par le biais d’un système de fichiers virtuel / émulé, et non du système actuel.C'est en référence à ma réponse précédente ici , mais avec des détails plus pertinents.
STOCKAGE ANDROID:
Sur Android 5 :
Sur Android 6+ :
*
>S>
pour le lien symbolique,>E>
pour l'émulation et>B>
pour le montage lié*
USER-ID
de l'utilisateur actuel en cas deMultiple Users
ouWork Profile
, normalement0
, le propriétaire de l'appareil*
VIEW
est l'une desread
applications (pour les applications avec permission.READ_EXTERNAL_STORAGE) ouwrite
(permission.WRITE_EXTERNAL_STORAGE) oudefault
(pour les processus exécutés à la racine / global mount namespace, c'est-à-dire en dehors de zygote)* Il existait des différences mineures entre les versions précédentes d'Android, mais le concept d'émulation était le même depuis sa mise en œuvre.
* Pour un peu plus de détails sur l'implémentation de l'espace de noms de montage d'Android, voir cette réponse. .
En bref,
/sdcard
et/storage/emulated/0
qui - qui représentent un système de fichiers FAT / vFAT / FAT32 - pointent vers/data/media/0
(ou/mnt/expand/[UUID]/media/0
dans le cas de Adoptable Storage ) viaFUSE
ousdcardfs
émulation.N'étant pas spécifique à Android, mais généralement lié à Linux, lien de montage et liaison (voir "Création d'un montage ") sortent du cadre de cette question, car la question porte principalement sur l'émulation.
ÉMULATION:
Pourquoi l'émulation est ici? Le système de fichiers émulé est une couche d'abstraction sur un système de fichiers réel (
ext4
ouf2fs
) ayant deux objectifs principaux:Lisez le voyage de stockage d'Android pour plus de détails, le résumé est:
Les premiers appareils Android manquaient de stockage interne et utilisaient (physiquement) des cartes SD externes qui utilisent traditionnellement la famille de systèmes de fichiers FAT pour assurer la compatibilité avec la plupart des PC (reportez-vous à la domination de Microsoft sur le monde des PC).
Lorsque la taille de la mémoire de stockage interne a augmenté, le même système de fichiers a été déplacé sur une carte SD interne (encore appelée "externe").
Mais la mise en œuvre de FAT / vFAT présentait deux problèmes majeurs qui ont été abordés par Google progressivement:
ioctls
etc.FS_IOC_FIEMAP
). Ainsi, toutes les données sur la carte SD étaient disponibles pour toutes les applications (étant donné que chaque application Android est un utilisateur UNIX / Linux et possède un ID utilisateur) sans restrictions, ce qui pose de graves problèmes de confidentialité et de sécurité.Les deux problèmes ont été résolus par émulation:
/data
partition (ou une partition indépendante / sdcard sur certains périphériques précédemment) qui contient leext4
système de fichiers (progressivement remplacé parf2fs
), mettant pleinement en œuvre les autorisations UNIX./data
partition ne pouvait pas être exposée au PC pour deux autres raisons:(1)
elle contient beaucoup de paramètres et de données d'applications qui doivent être protégés des autres applications ainsi que des utilisateurs.(2)
Les systèmes de fichiers Linux ne sont pas pris en charge par Windows.Ainsi, UMS a été remplacé par Media Transfer Protocol, qui est une extension de type client-serveur pour PTP - un protocole déjà établi. MTP n'expose pas les périphériques en mode bloc mais fonctionne via une pile logicielle. L'hôte MTP s'exécute sur Android en tant qu'application (
android.process.media
) entièrement en mode bac à sable dans le cadre Android, incapable d'effectuer des tâches en escalade.Désormais, les applications (et MTP, qui est également une application) interagissent avec le stockage émulé au lieu de
/data/media
, réalisant les deux objectifs en même temps, c’est-à-dire appliquer des contrôles d’autorisation en dessous et ressembler au système de fichiers FAT sur la surface supérieure.Google implémente maintenant l'émulation via sdcardfs pour surmonter les défauts de FUSE ; l'un des principaux étant la surcharge d'entrée / sortie, c'est-à-dire d'améliorer les vitesses de lecture / écriture.
AUTORISATIONS DE STOCKAGE EXTERNE: Le
concept de fichiers publics et privés sur un stockage externe peut être démontré à l'aide d'un exemple:
Installer l'application Termux.
Créer des répertoires
/sdcard/Android/data/com.termux/test_dir
et/sdcard/test_dir
.Créer des fichiers
/sdcard/Android/data/com.termux/test_file
et/sdcard/Android/data/com.termux/test_file
.Exécutez les commandes suivantes:
* Vous devriez avoir WhatsApp installé ou sélectionner le dossier privé d'une autre application.
Forcez maintenant l'arrêt de l'application Termux et accordez l' autorisation de stockage . Exécutez à nouveau les commandes:
Voyez la différence dans les autorisations des mêmes fichiers et répertoires. Cela semble ne pas être possible simplement sans émulation sur un système de fichiers Linux natif lorsqu'il existe des centaines d'applications (utilisateurs) à gérer simultanément. C'est l'émulation du système de fichiers qui permet d'exposer le même fichier avec trois jeux d'autorisations différents en même temps, indépendamment de ses autorisations d'origine sur le système de fichiers réel:
Voir aussi Qu'est - ce que l'UID «u # _everybody»?
En relation:
la source
FAT-like permission-less filesystem
qui existait dans les premiers jours d'Android pour garantir la compatibilité ascendante et qui respecte le concept du concept de stockage externe d'Android. J'ai fait une modification pour élaborer mon point.