
Android est compatible avec les appareils dotés d'un 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 désigne tout stockage externe qui n'est pas adopté par le système et qui n'est donc pas formaté, chiffré ni associé à 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 de journalisation ne doivent être stockés que sur un espace de stockage interne où ils peuvent être efficacement protégés.
Stockage externe multi-utilisateur
À 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 d'autres utilisateurs.
- Le chemin d'accès
/sdcard
doit résoudre le stockage externe principal spécifique à l'utilisateur en fonction de l'utilisateur sous lequel un processus s'exécute. - Pour optimiser le stockage, plusieurs utilisateurs peuvent partager le stockage des fichiers OBB volumineux dans le répertoire
Android/obb
. - Le stockage externe secondaire ne doit pas être accessible en écriture par les applications, sauf dans les répertoires spécifiques au package, comme autorisé par les autorisations synthétisées.
L'implémentation de la plate-forme par défaut de cette fonctionnalité exploite les espaces de noms du noyau Linux pour créer des tables de montage isolées pour chaque processus créé par fork Zygote, puis utilise des montages de liaison pour proposer le stockage externe principal spécifique à l'utilisateur dans cet espace de noms privé.
Au démarrage, le système installe un seul daemon FUSE de stockage externe émulé à EMULATED_STORAGE_SOURCE
, qui est masqué des applications. Après les fourches Zygote, il lie le sous-répertoire spécifique à l'utilisateur approprié sous le daemon FUSE à EMULATED_STORAGE_TARGET
afin que les chemins d'accès au stockage externe soient résolus correctement pour l'application. Étant donné qu'une application ne dispose pas de points d'installation accessibles pour le stockage d'autres utilisateurs, elle ne peut accéder qu'au stockage de l'utilisateur avec lequel elle a été démarrée.
Cette implémentation utilise également la fonctionnalité de noyau de sous-arbre partagé 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 appareils de stockage externe
À partir d'Android 4.4, plusieurs appareils de stockage externe sont présentés aux développeurs via Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
et Context.getObbDirs()
.
L'autorisation WRITE_EXTERNAL_STORAGE
ne doit accorder que l'accès en écriture au stockage externe principal d'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 l'autorisent les autorisations synthétisées. En limitant les écritures de cette manière, le système peut nettoyer les fichiers lorsque les applications sont désinstallées.
Compatibilité avec les contenus multimédias USB
Android 6.0 est compatible avec 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 plate-forme affiche une notification lui permettant de copier ou de gérer le contenu de cet appareil.
Sous 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 contenus multimédias. Les applications tierces doivent passer par le Storage Access Framework pour interagir avec les fichiers sur un stockage portable. L'accès direct est explicitement bloqué pour des raisons de confidentialité et de sécurité.