Stockage

Icône HAL de stockage externe Android

Android a évolué au fil du temps pour prendre en charge une grande variété de types et de fonctionnalités de périphériques de stockage. Toutes les versions d'Android prennent en charge les appareils dotés d' un stockage traditionnel , qui inclut un stockage portable et émulé. Le stockage portable peut être fourni par un support physique, comme une carte SD ou une clé USB, destiné au transfert temporaire de données/au stockage de fichiers. Le support physique peut rester avec l'appareil pendant une période prolongée, mais n'est pas lié à l'appareil et peut être supprimé. Les cartes SD sont disponibles comme stockage portable depuis Android 1.0 ; Android 6.0 a ajouté la prise en charge USB. Le stockage émulé est fourni en exposant une partie du stockage interne via une couche d'émulation et est disponible depuis Android 3.0.

À partir d'Android 6.0, Android prend en charge le stockage adoptable , qui est fourni par un support physique, comme une carte SD ou une clé USB, qui est crypté et formaté pour se comporter comme un stockage interne. Le stockage adoptable peut stocker tous les types de données d’application.

Autorisations

L'accès au stockage externe est protégé par diverses autorisations Android. À partir d'Android 1.0, l'accès en écriture est protégé par l'autorisation WRITE_EXTERNAL_STORAGE . À partir d'Android 4.1, l'accès en lecture est protégé par l'autorisation READ_EXTERNAL_STORAGE .

À partir d'Android 4.4, le propriétaire, le groupe et les modes des fichiers sur les périphériques de stockage externes sont désormais synthétisés en fonction de la structure des répertoires. Cela permet aux applications de gérer leurs répertoires spécifiques au package sur un stockage externe sans avoir besoin de l'autorisation large WRITE_EXTERNAL_STORAGE . Par exemple, l'application portant le nom de package com.example.foo peut désormais accéder librement Android/data/com.example.foo/ sur des périphériques de stockage externes sans autorisation. Ces autorisations synthétisées sont obtenues en encapsulant les périphériques de stockage bruts dans un démon FUSE.

À partir d'Android 10, les applications qui ciblent Android 9 et les versions inférieures utilisent par défaut le stockage existant et peuvent opter pour un stockage isolé. Les applications qui ciblent Android 10 et utilisent par défaut le stockage isolé peuvent temporairement s'en désinscrire . Utilisez l'attribut manifeste requestLegacyExternalStorage , qui contrôle le modèle de stockage, pour modifier l'état par défaut.

Étant donné que les autorisations READ_EXTERNAL_STORAGE et WRITE_EXTERNAL_STORAGE sont soumises à des restrictions logicielles, si le programme d'installation n'a pas ajouté l'application à la liste blanche, l'autorisation contrôle uniquement l'accès aux collections sonores et visuelles, sans accès à la carte SD. Cela s'applique même si l'application demande un stockage existant. Pour plus d'informations sur les restrictions strictes et les restrictions logicielles, consultez Restrictions strictes et logicielles dans Android 10 .

Si le programme d'installation a ajouté l'autorisation à la liste blanche, une application exécutée en mode hérité obtient le comportement d'autorisation non isolé. L'autorisation contrôle l'accès à la carte SD et les collections sonores et visuelles. Cela se produit lorsque l'application cible Android 9 ou une version antérieure et n'accepte pas le stockage isolé, ou qu'elle cible Android 10 et se désactive.

L'état de la liste blanche ne peut être spécifié qu'au moment de l'installation et ne peut être modifié qu'une fois l'application installée.

Pour plus d'informations sur la définition de l'autorisation READ_EXTERNAL_STORAGE , consultez setWhitelistedRestrictedPermissions() dans la classe PackageInstaller.SessionParams .

Android 13 introduit des autorisations multimédias granulaires pour prendre en charge les applications qui accèdent aux fichiers multimédias créés par d'autres applications. Les applications doivent demander une ou plusieurs des autorisations multimédias granulaires répertoriées dans Autorisations multimédias granulaires au lieu de l’autorisation READ_EXTERNAL_STORAGE .

Android 14 s'appuie sur des autorisations multimédias granulaires pour permettre aux utilisateurs d'accorder un accès partiel à leur bibliothèque multimédia visuelle lorsque les applications demandent des autorisations multimédias. Voir Accorder un accès partiel aux photos et vidéos pour plus d’informations.

Autorisations d'exécution

Android 6.0 introduit un nouveau modèle d'autorisations d'exécution dans lequel les applications demandent des fonctionnalités lorsque cela est nécessaire au moment de l'exécution. Étant donné que le nouveau modèle inclut les autorisations READ/WRITE_EXTERNAL_STORAGE , la plate-forme doit accorder dynamiquement l'accès au stockage sans supprimer ni redémarrer les applications déjà en cours d'exécution. Pour ce faire, il conserve trois vues distinctes de tous les périphériques de stockage montés :

  • /mnt/runtime/default est affiché pour les applications sans autorisations de stockage spéciales, ainsi que pour l'espace de noms racine où se trouvent adbd et d'autres composants du système.
  • /mnt/runtime/read est affiché aux applications avec READ_EXTERNAL_STORAGE (définissez LEGACY_STORAGE pour Android 10)
  • /mnt/runtime/write est affiché aux applications avec WRITE_EXTERNAL_STORAGE

Au moment du fork de Zygote, nous créons un espace de noms de montage pour chaque application en cours d'exécution et lions le montage de la vue initiale appropriée en place. Plus tard, lorsque les autorisations d'exécution sont accordées, vold saute dans l'espace de noms de montage des applications déjà en cours d'exécution et lie la vue mise à niveau en place. Notez que les rétrogradations d’autorisation entraînent toujours la suppression de l’application.

La fonctionnalité setns() utilisée pour implémenter cette fonctionnalité nécessite au moins Linux 3.8, mais les correctifs ont été rétroportés avec succès vers Linux 3.4. Le test PermissionsHostTest CTS peut être utilisé pour vérifier le comportement correct du noyau.