Espace de stockage cloisonné

Le stockage limité limite l’accès des applications au stockage externe. Sous Android 11 ou version ultérieure, les applications ciblant l'API 30 ou version ultérieure doivent utiliser un stockage limité. Auparavant, dans Android 10, les applications pouvaient désactiver le stockage limité.

Restrictions d'accès aux applications

L’objectif du stockage limité 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 de téléchargement ou dans d'autres dossiers.

Les applications utilisant un stockage limité peuvent avoir les niveaux d’accès suivants (l’accès réel dépend de 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 ou en écriture aux répertoires de données d'applications externes d'autres applications

Utiliser le stockage limité avec FUSE

Android 11 ou version ultérieure prend en charge le système de fichiers dans l'espace utilisateur (FUSE), qui permet au module MediaProvider d'examiner les opérations sur les fichiers dans l'espace utilisateur et de contrôler l'accès aux fichiers en fonction de la politique permettant d'autoriser , de refuser ou de rédiger l'accès. Les applications du stockage limité qui utilisent FUSE bénéficient des fonctionnalités de confidentialité du stockage limité et de la possibilité d'accéder aux fichiers à l'aide d'un chemin de fichier direct (en gardant les API de fichiers opérationnelles dans les applications).

Android 10 a appliqué des règles de stockage étendues sur les accès aux fichiers par MediaProvider, mais pas pour l'accès direct au chemin de fichier (par exemple, à l'aide de l'API de fichier et des API NDK) en raison de l'effort requis pour intercepter les appels du noyau. Par conséquent, les applications dans le stockage limité ne pouvaient pas accéder aux fichiers en utilisant un chemin de fichier direct. Cette restriction a eu un impact sur la capacité d'adaptation des développeurs d'applications, car elle nécessitait des modifications substantielles du code pour réécrire l'accès de l'API de fichiers à l'API MediaProvider.

FUSE et SDCardFS

La prise en charge d'Android 11 pour FUSE n'est pas liée à la dépréciation de SDCardFS , mais offre une alternative à Media Store pour les appareils qui utilisaient auparavant SDCardFS. Dispositifs:

  • 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 une version ultérieure peut héberger FUSE au-dessus de SDCardFS pour intercepter les opérations sur les fichiers et atteindre les objectifs de confidentialité.

Optimisation des performances de FUSE

Android prenait auparavant en charge FUSE dans Android 7 ou version antérieure, dans lequel le stockage externe était monté en tant que FUSE. En raison de problèmes de performances et de blocages liés à cette implémentation de FUSE, Android 8 a introduit SDCardFS. Android 11 réintroduit la prise en charge de FUSE à l'aide d'une implémentation améliorée et mieux testée de libfuse qui peut être optimisée pour résoudre les problèmes de performances sous Android 7 ou version antérieure.

Le réglage 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 dépendent de ces répertoires.
  • Optimisations (telles que le réglage des taux de lecture anticipée et sale du système de fichiers FUSE) pour maintenir les lectures performantes et la lecture multimédia fluide.
  • Utilisation du cache de réécriture FUSE.
  • Autorisations de mise en cache pour réduire les IPC sur le serveur système.
  • Optimisations pour les applications avec accès à tous les fichiers pour 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 réglé à 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, lecture vidéo) entre l'accès au chemin de fichier et Media Store. Cependant, 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 soucieux des performances doivent utiliser les API MediaProvider pour leurs applications.

Atténuer l’impact sur les performances de FUSE

L'impact sur les performances de FUSE est limité aux gros utilisateurs de fichiers stockés sur un stockage partagé externe uniquement. Le stockage privé externe (qui comprend les répertoires android/data et android/obb ) est contourné par FUSE, tandis que le stockage interne (tel que /data/data , où de nombreuses applications stockent les données pour les garder cryptées et sécurisées) n'est pas monté par FUSE.

  • Les applications qui utilisent peu 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 voir aucun impact sur les performances liées à FUSE dans Android 11.

  • Les applications qui utilisent beaucoup de stockage externe partagé effectuent généralement des opérations de fichiers en masse, 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 en masse 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 la surcharge de performances de FUSE, les applications peuvent stocker des données dans un stockage privé externe ou utiliser des API en masse dans la classe ContentProvider pour contourner FUSE et obtenir un chemin optimisé en termes de performances. De plus, la mise à jour d'octobre 2020 du composant système MediaProvider inclut des optimisations de 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 .

La confidentialité plutôt que les performances

Sur les appareils configurés pour FUSE, les parcours utilisateur les plus critiques sont également performants entre Android 10 et Android 11. Cependant, lors des tests de référence sur un ensemble d'opérations sur les fichiers, Android 11 peut être moins performant qu'Android 10. Pour les modèles d'accès aux fichiers qui fonctionnent pire sous Android 11 (par exemple, lectures ou écritures aléatoires), nous vous recommandons d'utiliser les API MediaProvider pour donner aux applications un mode d'accès non FUSE, qui est la meilleure option et toujours performante.

Mises à jour 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 vers des collections de fichiers (par exemple, des images, des vidéos, des 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 du système de fichiers (pour FUSE) pour le stockage externe, ce qui rend le système de fichiers sur le stockage externe cohérent et la base de données MediaProvider. En tant que gestionnaire d'espace utilisateur pour le système de fichiers FUSE, MediaProvider peut intercepter les appels du noyau et garantir que les opérations sur les fichiers respectent la 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 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 par liaison radio à partir du Google Play Store ou d'autres mécanismes fournis par des partenaires. Tout ce qui correspond à ce qui est attendu d'un gestionnaire FUSE peut également être mis à jour, ce qui permet aux mises à jour de corriger les régressions et les bogues de performances de FUSE.