L'espace de stockage cloisonné limite l'accès des applications à l'espace de stockage externe. Sous Android 11 ou version ultérieure, les applications ciblant l'API 30 ou une version ultérieure doivent utiliser l'espace de stockage cloisonné. Auparavant, dans Android 10, les applications pouvaient désactiver l'espace de stockage cloisonné.
Restrictions d'accès des applications
L'objectif de l'espace de stockage cloisonné est de protéger la confidentialité des données des applications et des utilisateurs. Cela inclut la protection des informations utilisateur (telles que les métadonnées de photo), d'empêcher les applications de modifier ou de supprimer des fichiers utilisateur sans autorisation explicite, et de protéger les documents utilisateur sensibles téléchargés dans le dossier de téléchargement ou dans d'autres dossiers.
Les applications utilisant l'espace de stockage ciblé peuvent avoir les niveaux d'accès suivants (l'accès réel est spécifique à l'implémentation).
- Accès en lecture et en écriture à leurs propres fichiers sans autorisation
- Accès en lecture aux fichiers multimédias d'autres applications avec l'autorisation
READ_EXTERNAL_STORAGE
- L'accès en écriture aux fichiers multimédias d'autres applications n'est autorisé que si l'utilisateur donne son consentement direct (exceptions accordées à la galerie système et aux applications éligibles à l'accès à tous les fichiers)
- Aucun accès en lecture ni en écriture aux répertoires de données d'application externes d'autres applications
Utiliser l'espace de stockage cloisonné avec FUSE
Android 11 ou version ultérieure est compatible avec le système de fichiers en espace utilisateur (FUSE), ce qui permet au module MediaProvider d'examiner les opérations de fichier dans l'espace utilisateur et de contrôler l'accès aux fichiers en fonction de la règle permettant d'autoriser, refuser ou masquer l'accès. Les applications utilisant FUSE dans l'espace de stockage cloisonné bénéficient des fonctionnalités de confidentialité de l'espace de stockage cloisonné et de la possibilité d'accéder aux fichiers à l'aide d'un chemin d'accès direct (les API de fichiers continuent de fonctionner dans les applications).
Android 10 a appliqué des règles de stockage cloisonné aux accès aux fichiers par MediaProvider, mais pas pour l'accès direct au chemin d'accès aux fichiers (par exemple, à l'aide de l'API File et des API NDK) en raison de l'effort requis pour intercepter les appels du noyau. Par conséquent, les applications d'un espace de stockage cloisonné ne pouvaient pas accéder aux fichiers via un chemin d'accès direct. Cette restriction a eu un impact sur la capacité d'adaptation des développeurs d'applications, car elle nécessitait des modifications de code importantes pour réécrire l'accès à l'API File dans l'API MediaProvider.
FUSE et SDCardFS
La compatibilité d'Android 11 avec FUSE n'est pas liée à l'abandon de SDCardFS, mais fournit une alternative à Media Store pour les appareils qui utilisaient précédemment SDCardFS. Appareils :
- Le lancement avec Android 11 ou version ultérieure à l'aide du kernel 5.4 ou version ultérieure ne peut pas utiliser SDCardFS.
- La mise à niveau vers Android 11 ou une version ultérieure peut héberger FUSE sur SDCardFS pour intercepter les opérations de fichier et atteindre les objectifs de confidentialité.
Réglage des performances de FUSE
Android était auparavant compatible avec FUSE sous Android 7 ou version antérieure, dans lequel le stockage externe était installé en tant que FUSE. En raison de problèmes de performances et d'interblocage liés à cette implémentation FUSE, Android 8 a introduit SDCardFS. Android 11 prend de nouveau en charge FUSE à l'aide d'une implémentation améliorée et mieux testée de libfuse
, qui peut être ajustée pour résoudre les problèmes de performances sous Android 7 ou version antérieure.
Le réglage de FUSE comprend les ajustements suivants:
- Contournement de FUSE pour les répertoires
Android/data
etAndroid/obb
afin d'améliorer les performances des applications de jeu qui s'appuient sur ces répertoires. - Optimisations (telles que le réglage des ratios de lecture anticipée et de fichiers sales du système de fichiers FUSE) pour maintenir les lectures performantes et la lecture multimédia fluide.
- Utiliser le cache d'écriture FUSE
- Autorisations de mise en cache pour réduire les IPC au serveur système.
- Optimisations pour les applications ayant accès à tous les fichiers afin d'accélérer les opérations groupées.
Les ajustements de réglage ci-dessus peuvent produire des performances comparables entre les appareils FUSE et non FUSE. Par exemple, le test d'un Pixel 2 configuré à l'aide de FUSE et d'un Pixel 2 à l'aide de Media Store a révélé des performances de lecture séquentielle comparables (par exemple, la lecture vidéo) entre l'accès au chemin d'accès aux fichiers et Media Store. Toutefois, les écritures séquentielles étaient légèrement moins bonnes avec FUSE, et les lectures et écritures aléatoires pouvaient être jusqu'à deux fois plus lentes.
Les mesures des performances peuvent varier d'un appareil à l'autre et d'un cas d'utilisation spécifique à l'autre. Étant donné que les API MediaProvider offrent les performances les plus cohérentes, les développeurs d'applications qui sont préoccupés par les performances doivent utiliser les API MediaProvider pour leurs applications.
Limiter l'impact sur les performances de FUSE
L'impact sur les performances de FUSE est limité aux utilisateurs intensifs de fichiers stockés dans un espace de stockage partagé externe uniquement. Le stockage privé externe (qui inclut les répertoires android/data
et android/obb
) est contourné par FUSE, tandis que le stockage interne (comme /data/data
, où de nombreuses applications stockent des données pour les chiffrer et les sécuriser) n'est pas installé par FUSE.
Les applications qui utilisent peu l'espace de stockage externe partagé interagissent souvent avec un ensemble limité de fichiers (généralement moins de 100). Ces applications bénéficient des optimisations existantes des opérations de lecture et d'écriture courantes et ne devraient pas subir d'impact sur les performances lié à FUSE dans Android 11.
Les applications qui utilisent beaucoup l'espace de stockage externe partagé effectuent généralement des opérations de fichiers groupées, telles que la liste ou la suppression d'un répertoire contenant 1 000 fichiers, ou la création ou la suppression d'un répertoire contenant un million de fichiers sur le système de fichiers. Les opérations de fichiers groupés peuvent être affectées par FUSE sur Android 11, mais si ces applications sont éligibles à l'autorisation
MANAGE_EXTERNAL_STORAGE
, elles bénéficient des optimisations de performances incluses dans la mise à jour d'octobre 2020.
Pour éviter un impact sur les performances de FUSE, les applications peuvent stocker des données dans un espace de stockage privé externe ou utiliser des API groupées dans la classe ContentProvider
pour contourner FUSE et obtenir un chemin d'accès optimisé pour les performances. De plus, la mise à jour d'octobre 2020 du composant système MediaProvider inclut des optimisations des performances pour les gestionnaires de fichiers et les applications similaires (telles que la sauvegarde/restauration, l'antivirus) qui détiennent l'autorisation MANAGE_EXTERNAL_STORAGE
.
Privilégier la confidentialité par rapport aux performances
Sur les appareils optimisés pour FUSE, les parcours utilisateur les plus critiques sont tout aussi performants entre Android 10 et Android 11. Toutefois, lors des tests de référence sur un ensemble d'opérations de fichiers, Android 11 peut être moins performant qu'Android 10. Pour les modèles d'accès aux fichiers qui fonctionnent moins bien sous Android 11 (par exemple, les lectures ou écritures aléatoires), nous vous recommandons d'utiliser les API MediaProvider pour attribuer aux applications un mode d'accès non FUSE, qui est la meilleure option et qui offre des performances constantes.
Mises à jour de MediaProvider et FUSE
Le comportement du composant système MediaProvider diffère selon les versions d'Android.
Sous Android 10 et versions antérieures, SDCardFS était le système de fichiers et MediaProvider fournissait une interface aux collections de fichiers (images, vidéos, fichiers musicaux, etc.). Lorsqu'une application crée un fichier à l'aide de l'API File, elle peut demander à MediaProvider d'analyser le fichier et de l'enregistrer dans la base de données.
Dans Android 11 ou version ultérieure, SDCardFS est obsolète, et MediaProvider devient le gestionnaire du système de fichiers (pour FUSE) pour le stockage externe, ce qui rend le système de fichiers de l'espace de stockage externe et la base de données MediaProvider cohérents. En tant que gestionnaire d'espace utilisateur pour le système de fichiers FUSE, MediaProvider peut intercepter les appels du noyau et s'assurer que les opérations de fichiers respectent la confidentialité.
Sous Android 11 et versions ultérieures, MediaProvider est également un composant système modulaire (un module principal) qui peut être mis à jour en dehors des versions d'Android. Cela signifie que les problèmes de performances, de confidentialité ou de sécurité détectés dans MediaProvider peuvent être résolus et diffusés Over The Air à partir du Google Play Store ou d'autres mécanismes fournis par le partenaire. Tout ce qui relève du champ d'application d'un gestionnaire FUSE peut également être mis à jour, ce qui permet de corriger les régressions de performances et les bugs de FUSE.