Traditionelle Lagerung

HAL-Symbol für externen Android-Speicher

Android unterstützt Geräte mit herkömmlichem Speicher, der als Dateisystem ohne Berücksichtigung der Groß-/Kleinschreibung mit unveränderlichen POSIX-Berechtigungsklassen und -Modi definiert ist. Der Begriff des traditionellen Speichers umfasst emulierten und tragbaren Speicher. Unter tragbarem Speicher versteht man jeden externen Speicher, der nicht vom System übernommen wird und daher nicht formatiert und verschlüsselt oder an ein bestimmtes Gerät gebunden ist. Da herkömmlicher externer Speicher nur minimalen Schutz für gespeicherte Daten bietet, sollte Systemcode keine sensiblen Daten auf externem Speicher speichern. Insbesondere sollten Konfigurations- und Protokolldateien nur auf dem internen Speicher gespeichert werden, wo sie wirksam geschützt werden können.

Externer Mehrbenutzerspeicher

Ab Android 4.2 können Geräte mehrere Benutzer unterstützen und der externe Speicher muss die folgenden Einschränkungen erfüllen:

  • Jeder Benutzer muss über einen eigenen isolierten primären externen Speicher verfügen und darf keinen Zugriff auf den primären externen Speicher anderer Benutzer haben.
  • Der /sdcard -Pfad muss basierend auf dem Benutzer, unter dem ein Prozess ausgeführt wird, in den richtigen benutzerspezifischen primären externen Speicher aufgelöst werden.
  • Der Speicher für große OBB-Dateien im Android/obb Verzeichnis kann zur Optimierung von mehreren Benutzern gemeinsam genutzt werden.
  • Sekundärer externer Speicher darf von Apps nicht beschreibbar sein, außer in paketspezifischen Verzeichnissen, die durch synthetische Berechtigungen zulässig sind.

Die Standardplattformimplementierung dieser Funktion nutzt Linux-Kernel-Namespaces, um isolierte Mount-Tabellen für jeden Zygote-Fork-Prozess zu erstellen, und verwendet dann Bind-Mounts, um den richtigen benutzerspezifischen primären externen Speicher in diesem privaten Namespace bereitzustellen.

Beim Booten stellt das System einen einzelnen emulierten externen Speicher-FUSE-Daemon unter EMULATED_STORAGE_SOURCE bereit, der vor Apps verborgen ist. Nach den Forks von Zygote wird das entsprechende benutzerspezifische Unterverzeichnis unter dem FUSE-Daemon an EMULATED_STORAGE_TARGET gemountet, damit externe Speicherpfade für die App korrekt aufgelöst werden. Da eine App über keine zugänglichen Bereitstellungspunkte für den Speicher anderer Benutzer verfügt, können diese nur auf den Speicher des Benutzers zugreifen, als den sie gestartet wurde.

Diese Implementierung verwendet auch die Kernelfunktion für gemeinsam genutzte Teilbäume, um Mount-Ereignisse vom Standard-Root-Namespace in App-Namespaces weiterzugeben, wodurch sichergestellt wird, dass Funktionen wie ASEC-Container und OBB-Mounting weiterhin ordnungsgemäß funktionieren. Dies geschieht durch das Mounten der Rootfs als Shared und das erneute Mounten als Slave, nachdem jeder Zygote-Namespace erstellt wurde.

Mehrere externe Speichergeräte

Ab Android 4.4 werden Entwicklern über Context.getExternalFilesDirs() , Context.getExternalCacheDirs() und Context.getObbDirs() mehrere externe Speichergeräte angezeigt.

Externe Speichergeräte, die über diese APIs angezeigt werden, müssen ein semipermanenter Teil des Geräts sein (z. B. ein SD-Kartensteckplatz in einem Batteriefach). Entwickler erwarten, dass die an diesen Orten gespeicherten Daten über lange Zeiträume verfügbar sind. Aus diesem Grund sollten vorübergehende Speichergeräte (z. B. USB-Massenspeicherlaufwerke) nicht über diese APIs angezeigt werden.

Die Berechtigung WRITE_EXTERNAL_STORAGE darf nur Schreibzugriff auf den primären externen Speicher auf einem Gerät gewähren. Apps dürfen nicht auf sekundäre externe Speichergeräte schreiben, außer in ihre paketspezifischen Verzeichnisse, wie dies durch synthetische Berechtigungen zulässig ist. Durch die Einschränkung von Schreibvorgängen auf diese Weise wird sichergestellt, dass das System Dateien bereinigen kann, wenn Anwendungen deinstalliert werden.

Unterstützung für USB-Medien

Android 6.0 unterstützt tragbare Speichergeräte, die nur für kurze Zeit mit dem Gerät verbunden sind, wie z. B. USB-Sticks. Wenn ein Benutzer ein neues tragbares Gerät einfügt, zeigt die Plattform eine Benachrichtigung an, damit er den Inhalt dieses Geräts kopieren oder verwalten kann.

In Android 6.0 gilt jedes Gerät, das nicht übernommen wird, als tragbar. Da tragbare Speicher nur für kurze Zeit verbunden sind, vermeidet die Plattform schwere Vorgänge wie das Scannen von Medien. Apps von Drittanbietern müssen das Storage Access Framework durchlaufen, um mit Dateien auf tragbaren Speichern zu interagieren. Der direkte Zugriff ist aus Datenschutz- und Sicherheitsgründen ausdrücklich gesperrt.