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. Tragbarer Speicher ist definiert als jeder externe 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 Konfigurations- und Protokolldateien sollten nur dort auf internen Speicher abgelegt werden, wo sie effektiv geschützt werden können.

Externer Speicher für mehrere Benutzer

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

  • Jeder Benutzer muss über seinen 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.
  • Der sekundäre externe Speicher darf nicht von Apps beschreibbar sein, außer in paketspezifischen Verzeichnissen, wie dies durch synthetisierte Berechtigungen zulässig ist.

Die standardmäßige Plattformimplementierung 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 anzubieten.

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

Diese Implementierung verwendet auch das Kernel-Feature „Shared Subtree“, um Mount-Ereignisse aus dem Standard-Root-Namespace in App-Namespaces zu übertragen, wodurch sichergestellt wird, dass Features wie ASEC-Container und OBB-Mounting weiterhin ordnungsgemäß funktionieren. Dies geschieht, indem das rootfs als gemeinsam genutzt und dann als Slave erneut gemountet wird, nachdem jeder Zygote-Namespace erstellt wurde.

Mehrere externe Speichergeräte

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

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

Die 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 dürfen, außer in ihren paketspezifischen Verzeichnissen, wie dies durch synthetisierte Berechtigungen zulässig ist. Das Einschränken von Schreibvorgängen auf diese Weise stellt sicher, 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 USB-Sticks. Wenn ein Benutzer ein neues tragbares Gerät einsetzt, 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.