Espace de stockage cloisonné

L'espace de stockage cloisonné limite l'accès des applications à l'espace de stockage externe. Dans Android 11 ou version ultérieure, les applications ciblant l'API 30 ou 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 aux 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 des photos), l'empêchement des applications de modifier ou de supprimer des fichiers utilisateur sans autorisation explicite, et la protection des documents utilisateur sensibles téléchargés dans le dossier "Téléchargements" ou d'autres dossiers.

Les applications utilisant l'espace de stockage cloisonné 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é qu'avec le consentement direct de l'utilisateur (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 Filesystem in Userspace (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 autoriser, refuser, ou masquer l'accès. Les applications de l'espace de stockage cloisonné qui utilisent FUSE 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 aux fichiers (en conservant le fonctionnement des API File dans les applications).

Android 10 a appliqué les règles d'espace de stockage cloisonné aux accès aux fichiers par MediaProvider, mais pas à 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 de l'espace de stockage cloisonné ne pouvaient pas accéder aux fichiers à l'aide d'un chemin d'accès direct aux fichiers. Cette restriction a eu un impact sur la capacité des développeurs d'applications à s'adapter, car elle nécessitait des modifications de code importantes pour réécrire l'accès à l'API File vers l'API MediaProvider.

FUSE et SDCardFS

La compatibilité d'Android 11 avec FUSE n'est pas liée à l' abandon de SDCardFS, mais elle constitue une alternative à Media Store pour les appareils qui utilisaient auparavant SDCardFS. Appareils :

  • Le lancement avec Android 11 ou version ultérieure à l'aide du noyau 5.4 ou version ultérieure ne peut pas utiliser SDCardFS.
  • La mise à niveau vers Android 11 ou version ultérieure peut héberger FUSE au-dessus de 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 dans Android 7 ou version antérieure, dans lequel l'espace de stockage externe était installé en tant que FUSE. En raison de problèmes de performances et d'interblocage avec cette implémentation FUSE, Android 8 a introduit SDCardFS. Android 11 réintroduit la compatibilité avec 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 dans Android 7 ou version antérieure.

Le réglage de FUSE inclut les ajustements suivants :

  • Contournement de FUSE pour les répertoires Android/data et Android/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 données modifiées du système de fichiers FUSE) pour maintenir les performances de lecture et la fluidité de la lecture multimédia.
  • Utilisation du cache d'écriture différée FUSE.
  • Mise en cache des autorisations pour réduire les IPC vers le 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, les tests d'un Pixel 2 réglé à l'aide de FUSE et d'un Pixel 2 à l'aide de Media Store ont 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 de performances peuvent varier d'un appareil à l'autre et entre des cas d'utilisation spécifiques. Étant donné que les API MediaProvider offrent les performances les plus cohérentes, les développeurs d'applications qui se soucient des performances doivent utiliser les API MediaProvider pour leurs applications.

Limiter l'impact des performances de FUSE

L'impact des performances de FUSE est limité aux utilisateurs intensifs de fichiers stockés uniquement dans l'espace de stockage partagé externe. L'espace de stockage privé externe (qui inclut les répertoires android/data et android/obb) est contourné par FUSE, tandis que la mémoire de stockage interne (tel que /data/data, où de nombreuses applications stockent des données pour les chiffrer et les sécuriser) n'est pas installée 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 fichiers). Ces applications bénéficient des optimisations existantes des opérations de lecture et d'écriture courantes et ne devraient pas constater 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 dans le système de fichiers. Les opérations de fichiers groupées 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 des performances incluses dans la mise à jour d'octobre 2020.

Pour éviter la surcharge des 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 optimisé pour les performances. En outre, 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.

Confidentialité plutôt que performances

Sur les appareils qui ont été réglés pour FUSE, la plupart des parcours utilisateur critiques sont aussi performants entre Android 10 et Android 11. Toutefois, lors du test de benchmarks 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 moins performants dans Android 11 (par exemple, les lectures ou écritures aléatoires), nous vous recommandons d'utiliser les API MediaProvider pour offrir aux applications un mode d'accès non FUSE, qui est la meilleure option et qui offre des performances cohérentes.

Mises à jour de MediaProvider et de FUSE

Le comportement du composant système MediaProvider diffère selon les versions d'Android.

  • Dans Android 10 et versions antérieures, SDCardFS était le système de fichiers et MediaProvider fournissait une interface aux collections de fichiers (par exemple, images, vidéos, fichiers musicaux, etc.). Lorsqu'une application créait un fichier à l'aide de l'API File, elle pouvait 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 de système de fichiers (pour FUSE) pour l'espace de stockage externe, ce qui rend le système de fichiers sur 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 fichier sont sécurisées en termes de confidentialité.

Dans Android 11 et versions ultérieures, MediaProvider est également un composant système modulaire (un module Mainline) 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 distribués par voie hertzienne depuis le Google Play Store ou d'autres mécanismes fournis par des partenaires. Tout ce qui entre dans le champ d'application de ce qui est attendu d'un gestionnaire FUSE est également modifiable, ce qui permet de corriger les régressions de performances et les bugs de FUSE.