Configuration de l'appareil

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 sont 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: 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 de 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. Cet indicateur doit être suivi d'un libellé décrivant la carte, ainsi que 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 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

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