Le stockage externe est géré par une combinaison du service d'initialisation vold
et du service système StorageManagerService
. L'installation des volumes de stockage externes physiques est gérée par vold
, qui effectue des opérations de préproduction pour préparer le support avant de l'exposer aux applications.
Remarque:Dans Android 8.0, la classe MountService
a été rebaptisée StorageManagerService
.
Mises en correspondance de fichiers
Pour Android 4.2.2 et versions antérieures, le fichier de configuration vold.fstab
spécifique à l'appareil définit les mappages des appareils sysfs aux points d'installation du système de fichiers, et chaque ligne suit ce format:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label
: libellé du volume.mount_point
: chemin d'accès au système de fichiers sur lequel le volume doit être installé.partition
: numéro de partition (basé sur 1) ou "auto" pour la première partition utilisable.sysfs_path
: un ou plusieurs chemins sysfs vers des appareils pouvant fournir ce point d'installation. Séparés par des espaces, et chacun doit commencer par/
.flags
: liste facultative d'options séparées par une virgule. Ne doit pas contenir/
. Les valeurs possibles sontnonremovable
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
: chemin d'accès sous sysfs (généralement installé à /sys) vers l'appareil pouvant fournir le point d'installation. Le chemin d'accès doit commencer par/
.mount_point
: chemin d'accès au système de fichiers sur lequel le volume doit être installé.type
: type du système de fichiers sur le volume. Pour les cartes externes, il s'agit généralement devfat
.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. Cet indicateur doit être suivi d'un libellé décrivant la carte, ainsi que 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 la 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 apportées à 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 à l'appareil, généralement fourni via une superposition frameworks/base
, définit les attributs et les contraintes des appareils de stockage. L'élément <StorageList>
contient un ou plusieurs éléments <storage>
, dont un seul doit être marqué comme principal. Les attributs <storage>
incluent les suivants:
mountPoint
: chemin d'accès au système de fichiers de ce montage.storageDescription
: ressource de chaîne décrivant ce montage.primary
: "true" si cet emplacement est le stockage externe principal.removable
: "true" si ce montage comporte un support amovible, tel qu'une carte SD physique.emulated
: "true" si cet attachement est émulé et est basé sur un stockage interne, éventuellement à l'aide d'un démon FUSE.mtp-reserve
: nombre de Mo de stockage que MTP doit réserver pour l'espace de stockage disponible. N'est utilisé que lorsque le montage est marqué comme émulé.allowMassStorage
: "true" si ce montage peut être partagé via un 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, insensible à la casse, basé sur le stockage interne. Une implémentation possible est fournie par le daemon FUSE dans system/core/sdcard
, qui peut être ajouté en tant que service init.rc
spécifique à l'appareil:
# 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 d'installation cible.
Lorsque vous configurez un script init.rc
spécifique à l'appareil, la variable d'environnement EXTERNAL_STORAGE
doit être définie comme le chemin d'accès au stockage externe principal. Le chemin d'accès /sdcard
doit également correspondre 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 pour 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 à l'appareil, et plusieurs fichiers/variables de configuration statiques historiques ont été supprimés pour permettre 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 appareils de stockage sont désormais configurés de manière dynamique 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 d'installation spécifiques à l'utilisateur. À la place, la séparation des utilisateurs est désormais appliquée avec des GID spécifiques à l'utilisateur, et le stockage partagé principal est installé parvold
au moment de l'exécution.- Les développeurs peuvent continuer à créer des chemins de manière dynamique ou statique, selon leur cas d'utilisation. L'inclusion de l'UUID dans le chemin d'accès permet d'identifier chaque fiche afin de clarifier l'emplacement 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, selon leur cas d'utilisation. L'inclusion de l'UUID dans le chemin d'accès permet d'identifier chaque fiche afin de clarifier l'emplacement pour les développeurs. (Par exemple,
- Les services FUSE codés en dur ont été supprimés des fichiers
init.rc
spécifiques à l'appareil et sont désormais créés de manière dynamique à partir devold
si nécessaire.
En plus de ces modifications de configuration, Android 6.0 inclut 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 appareil de stockage adoptable dans fstab
, utilisez l'attribut encryptable=userdata
dans le champ fs_mgr_flags
. Voici une définition type:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Lorsqu'un appareil de stockage est adopté, la plate-forme efface son contenu et écrit une table de partitionnement GUID qui définit deux partitions:
- une petite partition
android_meta
vide réservée à une utilisation ultérieure. Le GUID de 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 fonctionnalités du kernel. Le GUID de type de partition est 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Mémoire de stockage externe
Dans fstab
, les appareils de stockage avec l'attribut voldmanaged
sont considérés comme portables par défaut, sauf si un autre attribut tel que encryptable=userdata
est défini. Par exemple, voici une définition type pour les appareils 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 l'installation. Les utilisateurs peuvent choisir de formater le support lorsque le système de fichiers n'est pas compatible.