Configuration de l'appareil

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 incluent nonremovable et encryptable .

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éralement vfat .
  • mnt_flags : Vold ignore ce champ et il doit être défini sur defaults
  • fs_mgr_flags : Vold ignore toutes les lignes du fstab unifié qui n'incluent pas l'indicateur voldmanaged= dans ce champ. Ce flag doit être suivi d'une étiquette décrivant la carte, et d'un numéro de partition ou du mot auto . Voici un exemple : voldmanaged=sdcard:auto . Les autres indicateurs possibles sont nonremovable , encryptable=sdcard , noemulatedsd et encryptable=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

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 par vold .
  • 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 par vold 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 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 de vold 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 de ext4 ou f2fs 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.