Gerätekonfiguration

Externer Speicher wird durch eine Kombination aus dem vold Init-Dienst und StorageManagerService Systemdienst verwaltet. Das Mounten physischer externer Speichervolumes wird von vold übernommen, das Staging-Vorgänge durchführt, um die Medien vorzubereiten, bevor sie Apps zur Verfügung gestellt werden.

Hinweis: In Android 8.0 wurde die MountService Klasse in StorageManagerService umbenannt.

Dateizuordnungen

Für Android 4.2.2 und früher definiert die gerätespezifische Konfigurationsdatei vold.fstab Zuordnungen von sysfs-Geräten zu Dateisystem-Mount-Punkten, und jede Zeile folgt diesem Format:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
  • label : Bezeichnung für das Volume.
  • mount_point : Dateisystempfad, in dem das Volume gemountet werden soll.
  • partition : Partitionsnummer (basierend auf 1) oder „auto“ für die erste nutzbare Partition.
  • sysfs_path : Ein oder mehrere sysfs-Pfade zu Geräten, die diesen Mount-Punkt bereitstellen können. Durch Leerzeichen getrennt und jeweils mit / beginnen.
  • flags : Optionale, durch Kommas getrennte Liste von Flags, darf kein / enthalten. Zu den möglichen Werten gehören nonremovable und encryptable .

Für Android-Versionen 4.3 und höher wurden die verschiedenen von init, vold und Recovery verwendeten fstab-Dateien in der Datei /fstab.<device> vereinheitlicht. 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 gemountet) zu dem Gerät, das den Mount-Punkt bereitstellen kann. Der Pfad muss mit / beginnen.
  • mount_point : Dateisystempfad, in dem das Volume gemountet werden soll.
  • type : Der Typ des Dateisystems auf dem Volume. Bei externen Karten ist dies normalerweise 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 nicht das Flag voldmanaged= in diesem Feld enthalten. Auf dieses Flag muss eine Bezeichnung folgen, die die Karte beschreibt, und eine Partitionsnummer oder das Wort auto . Hier ist ein Beispiel: voldmanaged=sdcard:auto . Andere mögliche Flags sind nonremovable , encryptable=sdcard , noemulatedsd und encryptable=userdata .

Konfigurationsdetails

Externe Speicherinteraktionen auf und über der Framework-Ebene werden über StorageManagerService abgewickelt. Aufgrund von Konfigurationsänderungen in Android 6.0 (z. B. der Entfernung des Ressourcen-Overlays „storage_list.xml“) sind die Konfigurationsdetails in zwei Kategorien unterteilt.

Android 5.x und früher

Die gerätespezifische Konfigurationsdatei storage_list.xml , die normalerweise ü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 markiert sein sollte. Zu <storage> -Attributen gehören:

  • mountPoint : Dateisystempfad dieses Mounts.
  • storageDescription : Zeichenfolgenressource, die diesen Mount beschreibt.
  • primary : wahr, wenn dieser Mount der primäre externe Speicher ist.
  • removable : wahr, wenn diese Halterung über Wechselmedien verfügt, z. B. eine physische SD-Karte.
  • emulated : wahr, wenn dieser Mount emuliert ist und durch internen Speicher unterstützt wird, möglicherweise unter Verwendung eines FUSE-Daemons.
  • mtp-reserve : Anzahl der MB Speicher, die MTP für freien Speicher reservieren soll. Wird nur verwendet, wenn der Mount als emuliert markiert ist.
  • allowMassStorage : wahr, wenn dieser Mount über einen USB-Massenspeicher geteilt werden kann.
  • maxFileSize : maximale Dateigröße in MB.

Geräte können externen Speicher bereitstellen, indem sie ein Dateisystem ohne Beachtung der Groß-/Kleinschreibung und ohne Berechtigung emulieren, das durch internen Speicher unterstützt wird. Eine mögliche Implementierung stellt der FUSE-Daemon in system/core/sdcard bereit, 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 unterstützende interne Speicher und dest_path der Ziel-Mount-Punkt.

Beim Konfigurieren eines gerätespezifischen init.rc Skripts muss die Umgebungsvariable EXTERNAL_STORAGE als Pfad zum primären externen Speicher definiert werden. Der /sdcard Pfad muss ebenfalls zum selben Speicherort aufgelöst werden, möglicherweise über einen Symlink. Wenn ein Gerät zwischen Plattformaktualisierungen den Standort des externen Speichers anpasst, sollten Symlinks erstellt werden, damit alte Pfade weiterhin funktionieren.

Android 6.0

Die Konfiguration des Speichersubsystems konzentriert sich jetzt auf die gerätespezifische fstab Datei, und mehrere historische statische Konfigurationsdateien/-variablen wurden entfernt, um dynamischeres Verhalten zu unterstützen:

  • Das Ressourcen-Overlay storage_list.xml 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 benutzerspezifischer Mountpunkte verwendet. Stattdessen wird die Benutzertrennung jetzt mit benutzerspezifischen GIDs erzwungen und der primäre gemeinsam genutzte Speicher wird zur Laufzeit von vold bereitgestellt.
    • Entwickler können Pfade je nach Anwendungsfall weiterhin dynamisch oder statisch erstellen. Durch die Einbeziehung der UUID in den Pfad wird jede Karte identifiziert, um den Standort für Entwickler klarer zu machen. (Zum Beispiel 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 stattdessen bei Bedarf dynamisch von vold geforkt.

Zusätzlich zu diesen Konfigurationsänderungen beinhaltet Android 6.0 die Idee eines anpassbaren Speichers. Bei Android 6.0-Geräten werden alle physischen Medien, die nicht übernommen werden, als tragbar angesehen.

Anpassbare Aufbewahrung

Um ein verwendbares Speichergerät in der fstab anzugeben, verwenden Sie das Attribut encryptable=userdata im Feld fs_mgr_flags . Hier ist 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 Partitionstyp-GUID lautet 19A710A2-B3CA-11E4-B026-10604B889DCF.
  • eine große android_ext Partition, die mit dm-crypt verschlüsselt und je nach Kernel-Fähigkeiten entweder mit ext4 oder f2fs formatiert wird. Die Partitionstyp-GUID lautet 193D1EA4-B3CA-11E4-B075-10604B889DCF.

Tragbarer Speicher

In der fstab gelten Speichergeräte mit dem Attribut voldmanaged standardmäßig als portierbar, 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 Mounten zu erkennen, und Benutzer können das Medium formatieren, wenn das Dateisystem nicht unterstützt wird.