Android prend en charge les appareils dotés d'un stockage traditionnel, 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é, chiffré ou lié à un appareil 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 un stockage externe. Plus précisément, les fichiers de configuration et les fichiers 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 répondre aux 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 être résolu vers le stockage externe principal spécifique à l'utilisateur, en fonction de l'utilisateur sous lequel un processus est exécuté. - 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 cette fonctionnalité sur la plate-forme 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 de liaison pour offrir le stockage externe principal spécifique à l'utilisateur 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é des applications. Après le fork de Zygote, il monte le sous-répertoire spécifique à l'utilisateur approprié sous le démon FUSE vers EMULATED_STORAGE_TARGET
afin que les chemins de stockage externes soient résolus correctement pour l'application. Étant donné qu'une application ne dispose pas de points de montage accessibles pour le stockage des autres utilisateurs, ceux-ci ne peuvent accéder qu'au stockage de l'utilisateur sous lequel elle a été lancée.
Cette implémentation utilise également la fonctionnalité de noyau de sous-arborescence partagée pour propager les événements de montage depuis l'espace de noms racine par défaut vers les espaces de noms d'application, ce qui garantit que les 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 médias 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.
Sous Android 6.0, tout appareil non adopté est considéré comme portable. Le stockage portable n’étant connecté que pendant une courte période, la plateforme évite des opérations lourdes telles que l’analyse des médias. Les applications tierces doivent passer par 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é.