Gerätekonfiguration

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 sind nonremovable und encryptable.

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 Regel vfat.
  • mnt_flags: Vold ignoriert dieses Feld und es sollte auf defaults gesetzt werden.
  • fs_mgr_flags: Vold ignoriert alle Zeilen in der einheitlichen fstab, die in diesem Feld nicht das Flag voldmanaged= enthalten. Auf dieses Flag muss ein Label folgen, das die Karte beschreibt, und eine Partitionsnummer oder das Wort auto. Hier ein Beispiel: voldmanaged=sdcard:auto. Weitere mögliche Flags sind nonremovable, encryptable=sdcard, noemulatedsd und encryptable=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 von vold 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 von vold 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.
  • Die hartcodierten FUSE-Dienste wurden aus gerätespezifischen init.rc-Dateien entfernt und werden bei Bedarf dynamisch von vold 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 mit ext4 oder f2fs 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.