Le stockage externe est géré par une combinaison du service vold
init et du service système StorageManagerService
. Le montage des volumes de stockage externes physiques est géré par vold
, qui effectue des opérations de préparation pour préparer le support avant de l'exposer aux applications.
Remarque : Dans Android 8.0, la classe MountService
a été renommée StorageManagerService
.
Mappages de fichiers
Pour Android 4.2.2 et versions antérieures, le fichier de configuration vold.fstab
spécifique au périphérique définit les mappages des périphériques sysfs vers les points de montage du système de fichiers, et chaque ligne suit ce format :
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
-
label
: Étiquette du volume. -
mount_point
: Chemin du système de fichiers où le volume doit être monté. -
partition
: Numéro de partition (basé sur 1), ou 'auto' pour la première partition utilisable. -
sysfs_path
: un ou plusieurs chemins sysfs vers les périphériques pouvant fournir ce point de montage. Séparés par des espaces, et chacun doit commencer par/
. -
flags
: liste facultative d’indicateurs séparés par des virgules, ne doit pas contenir/
. Les valeurs possibles incluentnonremovable
etencryptable
.
Pour les versions Android 4.3 et ultérieures, les différents fichiers fstab utilisés par init, vold et recovery ont été unifiés dans le fichier /fstab.<device>
. Pour les volumes de stockage externes gérés par vold
, les entrées doivent avoir le format suivant :
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
-
src
: Un chemin sous sysfs (généralement monté sur /sys) vers le périphérique qui peut fournir le point de montage. Le chemin doit commencer par/
. -
mount_point
: Chemin du système de fichiers où le volume doit être monté. -
type
: Le type du système de fichiers sur le volume. Pour les cartes externes, il s'agit généralementvfat
. -
mnt_flags
:Vold
ignore ce champ et il doit être défini surdefaults
-
fs_mgr_flags
:Vold
ignore toutes les lignes du fstab unifié qui n'incluent pas l'indicateurvoldmanaged=
dans ce champ. Ce flag doit être suivi d'une étiquette décrivant la carte, et d'un numéro de partition ou du motauto
. Voici un exemple :voldmanaged=sdcard:auto
. Les autres indicateurs possibles sontnonremovable
,encryptable=sdcard
,noemulatedsd
etencryptable=userdata
.
Détails de configuration
Les interactions de stockage externe au niveau du framework et au-dessus sont gérées via StorageManagerService
. En raison des modifications de configuration dans Android 6.0 (comme la suppression de la superposition de ressources storage_list.xml), les détails de configuration sont divisés en deux catégories.
Android 5.x et versions antérieures
Le fichier de configuration storage_list.xml
spécifique au périphérique, généralement fourni via une superposition frameworks/base
, définit les attributs et les contraintes des périphériques de stockage. L'élément <StorageList>
contient un ou plusieurs éléments <storage>
, dont un exactement doit être marqué comme principal. Les attributs <storage>
incluent :
-
mountPoint
: chemin du système de fichiers de ce montage. -
storageDescription
: ressource de chaîne qui décrit ce montage. -
primary
: vrai si ce montage est le stockage externe principal. -
removable
: vrai si ce support dispose d'un support amovible, tel qu'une carte SD physique. -
emulated
: vrai si ce montage est émulé et est sauvegardé par le stockage interne, éventuellement en utilisant un démon FUSE. -
mtp-reserve
: nombre de Mo de stockage que MTP doit réserver pour du stockage gratuit. Utilisé uniquement lorsque le montage est marqué comme émulé. -
allowMassStorage
: true si ce montage peut être partagé via le stockage de masse USB. -
maxFileSize
: taille maximale du fichier en Mo.
Les appareils peuvent fournir un stockage externe en émulant un système de fichiers sans autorisation et insensible à la casse, soutenu par le stockage interne. Une implémentation possible est fournie par le démon FUSE dans system/core/sdcard
, qui peut être ajouté en tant que service init.rc
spécifique au périphérique :
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
Où source_path
est le stockage interne de sauvegarde et dest_path
est le point de montage cible.
Lors de la configuration d'un script init.rc
spécifique au périphérique, la variable d'environnement EXTERNAL_STORAGE
doit être définie comme chemin d'accès au stockage externe principal. Le chemin /sdcard
doit également aboutir au même emplacement, éventuellement via un lien symbolique. Si un appareil ajuste l'emplacement du stockage externe entre les mises à jour de la plate-forme, des liens symboliques doivent être créés afin que les anciens chemins continuent de fonctionner.
Android 6.0
La configuration du sous-système de stockage est désormais concentrée dans le fichier fstab
spécifique au périphérique, et plusieurs fichiers/variables de configuration statiques historiques ont été supprimés pour prendre en charge un comportement plus dynamique :
- La superposition de ressources
storage_list.xml
a été supprimée et n'est plus utilisée par le framework. Les périphériques de stockage sont désormais configurés dynamiquement lorsqu'ils sont détectés parvold
. - Les variables d'environnement
EMULATED_STORAGE_SOURCE/TARGET
ont été supprimées et ne sont plus utilisées par Zygote pour configurer les points de montage spécifiques à l'utilisateur. Au lieu de cela, la séparation des utilisateurs est désormais appliquée avec des GID spécifiques à l'utilisateur, et le stockage partagé principal est monté en place parvold
au moment de l'exécution.- Les développeurs peuvent continuer à créer des chemins de manière dynamique ou statique en fonction de leur cas d'utilisation. L'inclusion de l'UUID dans le chemin identifie chaque carte afin de rendre l'emplacement plus clair pour les développeurs. (Par exemple,
/storage/ABCD-1234/report.txt
est clairement un fichier différent de/storage/DCBA-4321/report.txt
.)
- Les développeurs peuvent continuer à créer des chemins de manière dynamique ou statique en fonction de leur cas d'utilisation. L'inclusion de l'UUID dans le chemin identifie chaque carte afin de rendre l'emplacement plus clair pour les développeurs. (Par exemple,
- Les services FUSE codés en dur ont été supprimés des fichiers
init.rc
spécifiques au périphérique et sont plutôt dupliqués dynamiquement à partir devold
lorsque cela est nécessaire.
En plus de ces changements de configuration, Android 6.0 intègre la notion de stockage adoptable. Pour les appareils Android 6.0, tout support physique non adopté est considéré comme portable.
Stockage adoptable
Pour indiquer un périphérique de stockage adoptable dans le fstab
, utilisez l'attribut encryptable=userdata
dans le champ fs_mgr_flags
. Voici une définition typique :
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Lorsqu'un périphérique de stockage est adopté, la plateforme efface le contenu et écrit une table de partition GUID qui définit deux partitions :
- une petite partition
android_meta
vide réservée à une utilisation future. Le GUID du type de partition est 19A710A2-B3CA-11E4-B026-10604B889DCF. - une grande partition
android_ext
chiffrée à l'aide de dm-crypt et formatée à l'aide deext4
ouf2fs
en fonction des capacités du noyau. Le GUID du type de partition est 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Stockage portable
Dans le fstab
, les périphériques de stockage avec l'attribut voldmanaged
sont considérés comme portables par défaut à moins qu'un autre attribut tel que encryptable=userdata
ne soit défini. Par exemple, voici une définition typique pour les périphériques USB OTG :
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
La plate-forme utilise blkid
pour détecter les types de systèmes de fichiers avant le montage, et les utilisateurs peuvent choisir de formater le support lorsque le système de fichiers n'est pas pris en charge.