
Android prend en charge les appareils avec stockage traditionnel, qui est défini comme un système de fichiers insensible à la casse avec des classes et des modes d'autorisation POSIX immuables. La notion de stockage traditionnel englobe le stockage émulé et portable. Le stockage portable est défini comme tout stockage externe qui n'est pas adopté par le système et donc non formaté et chiffré ou lié à un périphérique spécifique. Étant donné que le stockage externe traditionnel offre une protection minimale pour les données stockées, le code système ne doit pas stocker de données sensibles sur le stockage externe. Plus précisément, les fichiers de configuration et journaux ne doivent être stockés que sur un stockage interne où ils peuvent être efficacement protégés.
Stockage externe multi-utilisateurs
À partir d'Android 4.2, les appareils peuvent prendre en charge plusieurs utilisateurs, et le stockage externe doit respecter les contraintes suivantes :
- Chaque utilisateur doit disposer de son propre stockage externe principal isolé et ne doit pas avoir accès au stockage externe principal des autres utilisateurs.
- Le chemin
/sdcard
doit résoudre le stockage externe principal spécifique à l'utilisateur correct en fonction de l'utilisateur sous lequel un processus s'exécute. - Le stockage des fichiers OBB volumineux dans le répertoire
Android/obb
peut être partagé entre plusieurs utilisateurs à titre d'optimisation. - Le stockage externe secondaire ne doit pas être accessible en écriture par les applications, sauf dans les répertoires spécifiques au package, comme le permettent les autorisations synthétisées.
L'implémentation par défaut de la plate-forme de cette fonctionnalité exploite les espaces de noms du noyau Linux pour créer des tables de montage isolées pour chaque processus dérivé de Zygote, puis utilise des montages liés pour offrir le stockage externe principal spécifique à l'utilisateur correct dans cet espace de noms privé.
Au démarrage, le système monte un seul démon FUSE de stockage externe émulé sur EMULATED_STORAGE_SOURCE
, qui est masqué pour les applications. Après les fourches Zygote, il lie le sous-répertoire spécifique à l'utilisateur approprié du démon FUSE à EMULATED_STORAGE_TARGET
afin que les chemins de stockage externes soient correctement résolus pour l'application. Étant donné qu'une application ne dispose pas de points de montage accessibles pour le stockage des autres utilisateurs, ils ne peuvent accéder au stockage que pour l'utilisateur avec lequel elle a été démarrée.
Cette implémentation utilise également la fonctionnalité de noyau de sous-arborescence partagée pour propager les événements de montage à partir de l'espace de noms racine par défaut dans les espaces de noms d'application, ce qui garantit que des fonctionnalités telles que les conteneurs ASEC et le montage OBB continuent de fonctionner correctement. Pour ce faire, il monte le rootfs en tant que partagé, puis le remonte en tant qu'esclave après la création de chaque espace de noms Zygote.
Plusieurs périphériques de stockage externes
À partir d'Android 4.4, plusieurs périphériques de stockage externes sont présentés aux développeurs via Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
et Context.getObbDirs()
.
L'autorisation WRITE_EXTERNAL_STORAGE
doit uniquement accorder un accès en écriture au stockage externe principal sur un appareil. Les applications ne doivent pas être autorisées à écrire sur des périphériques de stockage externes secondaires, sauf dans leurs répertoires spécifiques au package, comme le permettent les autorisations synthétisées. Restreindre les écritures de cette manière garantit que le système peut nettoyer les fichiers lorsque les applications sont désinstallées.
Prise en charge des supports USB
Android 6.0 prend en charge les périphériques de stockage portables qui ne sont connectés à l'appareil que pendant une courte période, comme les clés USB. Lorsqu'un utilisateur insère un nouvel appareil portable, la plateforme affiche une notification pour lui permettre de copier ou de gérer le contenu de cet appareil.
Dans Android 6.0, tout appareil non adopté est considéré comme portable. Étant donné que le stockage portable n'est connecté que pendant une courte période, la plate-forme évite les opérations lourdes telles que l'analyse des médias. Les applications tierces doivent passer par le Storage Access Framework pour interagir avec les fichiers sur le stockage portable ; l'accès direct est explicitement bloqué pour des raisons de confidentialité et de sécurité.