Der externe Speicher wird über eine Kombination aus dem vold
init-Dienst und dem StorageManagerService
-Systemdienst verwaltet. Das Bereitstellen physischer externer Speichervolumes wird von vold
verwaltet, das Staging-Vorgänge ausführt, um die Medien vorzubereiten, bevor sie für Apps freigegeben werden.
Hinweis:Unter Android 8.0 wurde die Klasse MountService
in StorageManagerService
umbenannt.
Dateizuordnungen
Unter Android 4.2.2 und niedriger werden in der gerätespezifischen Konfigurationsdatei vold.fstab
Zuordnungen von sysfs-Geräten zu Dateisystem-Anlegepunkten definiert. Jede Zeile folgt dabei diesem Format:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label
: Label für das Volume.mount_point
: Dateisystempfad, unter dem das Volume bereitgestellt werden soll.partition
: Partitionsnummer (ab 1) oder „auto“ für die erste verwendbare Partition.sysfs_path
: Ein oder mehrere sysfs-Pfade zu Geräten, die diesen Bereitstellungspunkt bereitstellen können. Sie müssen durch Leerzeichen getrennt sein und mit/
beginnen.flags
: Optionale, durch Kommas getrennte Liste von Flags, darf/
nicht enthalten. Mögliche Werte sindnonremovable
undencryptable
.
Ab Android 4.3 wurden die verschiedenen fstab-Dateien, die von init, vold und recovery verwendet werden, in der Datei /fstab.<device>
zusammengeführt. Für externe Speichervolumes, die von vold
verwaltet werden, sollten die Einträge das folgende Format haben:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src
: Ein Pfad unter sysfs (normalerweise unter /sys bereitgestellt) zum Gerät, das den Bereitstellungspunkt bereitstellen kann. Der Pfad muss mit/
beginnen.mount_point
: Dateisystempfad, unter dem das Volume bereitgestellt werden soll.type
: Der Dateisystemtyp des Volumes. Bei externen Karten ist dies in der Regelvfat
.mnt_flags
:Vold
ignoriert dieses Feld und es sollte aufdefaults
gesetzt werden.fs_mgr_flags
:Vold
ignoriert alle Zeilen in der einheitlichen fstab, die in diesem Feld nicht das Flagvoldmanaged=
enthalten. Auf dieses Flag muss ein Label folgen, das die Karte beschreibt, und eine Partitionsnummer oder das Wortauto
. Hier ein Beispiel:voldmanaged=sdcard:auto
. Weitere mögliche Flags sindnonremovable
,encryptable=sdcard
,noemulatedsd
undencryptable=userdata
.
Konfigurationsdetails
Interaktionen mit externen Speichern auf und über der Framework-Ebene werden über StorageManagerService
verwaltet. Aufgrund von Konfigurationsänderungen in Android 6.0 (z. B. das Entfernen des Ressourcen-Overlays „storage_list.xml“) sind die Konfigurationsdetails in zwei Kategorien unterteilt.
Android 5.x und niedriger
Die gerätespezifische storage_list.xml
-Konfigurationsdatei, die in der Regel über ein frameworks/base
-Overlay bereitgestellt wird, definiert die Attribute und Einschränkungen von Speichergeräten. Das <StorageList>
-Element enthält ein oder mehrere <storage>
-Elemente, von denen genau eines als primär gekennzeichnet sein muss. Beispiele für <storage>
-Attribute:
mountPoint
: Dateisystempfad dieses Bereitstellungspunkts.storageDescription
: Stringressource, die diese Bereitstellung beschreibt.primary
: „wahr“, wenn diese Bereitstellung der primäre externe Speicher ist.removable
: „wahr“, wenn dieses Laufwerk Wechselmedien wie eine physische SD-Karte enthält.emulated
: „wahr“, wenn diese Bereitstellung emuliert und durch den internen Speicher unterstützt wird, möglicherweise mit einem FUSE-Daemon.mtp-reserve
: Anzahl der MB Speicher, die MTP für kostenlosen Speicher reservieren soll. Wird nur verwendet, wenn die Bereitstellung als emuliert gekennzeichnet ist.allowMassStorage
: „wahr“, wenn diese Bereitstellung über USB-Massenspeicher freigegeben werden kann.maxFileSize
: Maximale Dateigröße in MB.
Geräte können externen Speicher bereitstellen, indem sie ein zeicheninsensitives, berechtigungsfreies Dateisystem emulieren, das vom internen Speicher unterstützt wird. Eine mögliche Implementierung wird vom FUSE-Daemon in system/core/sdcard
bereitgestellt, der als gerätespezifischer init.rc
-Dienst hinzugefügt werden kann:
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
Dabei ist source_path
der zugrunde liegende interne Speicher und dest_path
der Ziel-Bereitstellungspunkt.
Wenn Sie ein gerätespezifisches init.rc
-Script konfigurieren, muss die Umgebungsvariable EXTERNAL_STORAGE
als Pfad zum primären externen Speicher definiert werden. Der Pfad /sdcard
muss ebenfalls auf denselben Speicherort verweisen, gegebenenfalls über einen Symlink. Wenn ein Gerät den Speicherort des externen Speichers zwischen Plattformupdates anpasst, sollten Symlinks erstellt werden, damit alte Pfade weiterhin funktionieren.
Android 6.0
Die Konfiguration des Speichersubsystems ist jetzt in der gerätespezifischen Datei fstab
zusammengefasst. Außerdem wurden mehrere bisherige statische Konfigurationsdateien/-variablen entfernt, um ein dynamischeres Verhalten zu ermöglichen:
- Das
storage_list.xml
-Ressourcen-Overlay wurde entfernt und wird vom Framework nicht mehr verwendet. Speichergeräte werden jetzt dynamisch konfiguriert, wenn sie vonvold
erkannt werden. - Die Umgebungsvariablen
EMULATED_STORAGE_SOURCE/TARGET
wurden entfernt und werden von Zygote nicht mehr zum Konfigurieren von benutzerspezifischen Bereitstellungspunkten verwendet. Stattdessen wird die Nutzertrennung jetzt mit nutzerspezifischen GIDs erzwungen und der primäre freigegebene Speicher wird vonvold
zur Laufzeit bereitgestellt.- Entwickler können Pfade je nach Anwendungsfall weiterhin dynamisch oder statisch erstellen. Durch die Aufnahme der UUID in den Pfad wird jede Karte eindeutig identifiziert, um die Position für Entwickler verständlicher zu machen. Beispielsweise ist
/storage/ABCD-1234/report.txt
eindeutig eine andere Datei als/storage/DCBA-4321/report.txt
.
- Entwickler können Pfade je nach Anwendungsfall weiterhin dynamisch oder statisch erstellen. Durch die Aufnahme der UUID in den Pfad wird jede Karte eindeutig identifiziert, um die Position für Entwickler verständlicher zu machen. Beispielsweise ist
- Die hartcodierten FUSE-Dienste wurden aus gerätespezifischen
init.rc
-Dateien entfernt und werden bei Bedarf dynamisch vonvold
forken.
Zusätzlich zu diesen Konfigurationsänderungen enthält Android 6.0 den Begriff „adaptierbarer Speicher“. Auf Geräten mit Android 6.0 werden alle nicht unterstützten physischen Medien als tragbar betrachtet.
Verwendbarer Speicher
Wenn Sie ein anpassbares Speichergerät in fstab
angeben möchten, verwenden Sie das Attribut encryptable=userdata
im Feld fs_mgr_flags
. Hier eine typische Definition:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Wenn ein Speichergerät übernommen wird, löscht die Plattform den Inhalt und schreibt eine GUID-Partitionstabelle, die zwei Partitionen definiert:
- eine kleine leere
android_meta
-Partition, die für die zukünftige Verwendung reserviert ist. Die GUID des Partitionstyps lautet 19A710A2-B3CA-11E4-B026-10604B889DCF. - eine große
android_ext
-Partition, die mit dm-crypt verschlüsselt und je nach Kernelfunktionen entweder mitext4
oderf2fs
formatiert wird. Die GUID des Partitionstyps lautet 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Mobiler Speicher
In der fstab
werden Speichergeräte mit dem Attribut voldmanaged
standardmäßig als tragbar betrachtet, sofern kein anderes Attribut wie encryptable=userdata
definiert ist. Hier ist beispielsweise eine typische Definition für USB-OTG-Geräte:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
Die Plattform verwendet blkid
, um Dateisystemtypen vor dem Bereitstellen zu erkennen. Nutzer können die Medien formatieren, wenn das Dateisystem nicht unterstützt wird.