
Android unterstützt Geräte mit traditionellem Speicher, der als einfallsunabhängiges Dateisystem mit unveränderlichen POSIX-Berechtigungsklassen und -Modi definiert ist. Der Begriff „traditioneller Speicher“ umfasst emulierten und tragbaren Speicher. Als tragbarer Speicher wird jeder externe Speicher definiert, der vom System nicht übernommen wird und daher nicht formatiert und verschlüsselt oder mit einem bestimmten Gerät verknüpft ist. Da herkömmlicher externer Speicher nur einen minimalen Schutz für gespeicherte Daten bietet, sollten im Systemcode keine vertraulichen Daten im externen Speicher gespeichert werden. Insbesondere sollten Konfigurations- und Protokolldateien nur im internen Speicher gespeichert werden, wo sie effektiv geschützt werden können.
Externer Speicher für mehrere Nutzer
Ab Android 4.2 können Geräte mehrere Nutzer unterstützen. Externer Speicher muss die folgenden Einschränkungen erfüllen:
- Jeder Nutzer muss einen eigenen isolierten primären externen Speicher haben und darf keinen Zugriff auf den primären externen Speicher anderer Nutzer haben.
- Der Pfad
/sdcard
muss auf den richtigen nutzerspezifischen primären externen Speicher verweisen, je nachdem, als welcher Nutzer ein Prozess ausgeführt wird. - Der Speicherplatz für große OBB-Dateien im Verzeichnis
Android/obb
kann zur Optimierung für mehrere Nutzer freigegeben werden. - Der sekundäre externe Speicher darf von Apps nicht beschreibbar sein, mit Ausnahme von paketspezifischen Verzeichnissen, wie dies durch synthetisierte Berechtigungen zulässig ist.
Die Standardplattformimplementierung dieser Funktion nutzt Linux-Kernel-Namespaces, um für jeden von Zygote gegabelten Prozess isolierte Bereitstellungstabellen zu erstellen, und verwendet dann Bindungsverknüpfungen, um den richtigen nutzerspezifischen primären externen Speicher in diesem privaten Namespace bereitzustellen.
Beim Starten stellt das System einen einzelnen emulierten externen Speicher-FUSE-Daemon unter EMULATED_STORAGE_SOURCE
bereit, der für Apps ausgeblendet ist. Nach dem Fork des Zygote wird das entsprechende benutzerspezifische Unterverzeichnis unter dem FUSE-Daemon auf EMULATED_STORAGE_TARGET
bereitgestellt, damit externe Speicherpfade für die App korrekt aufgelöst werden. Da einer App keine zugänglichen Bereitstellungspunkte für den Speicher anderer Nutzer fehlen, kann sie nur auf den Speicher des Nutzers zugreifen, als der sie gestartet wurde.
Bei dieser Implementierung wird auch die gemeinsame subtree-Kernelfunktion verwendet, um Bereitstellungsereignisse aus dem Standard-Stamm-Namespace in App-Namespaces zu übertragen. So wird sichergestellt, dass Funktionen wie ASEC-Container und OBB-Bereitstellung weiterhin ordnungsgemäß funktionieren. Dazu wird das Rootfs als freigegeben bereitgestellt und nach dem Erstellen jedes Zygote-Namespace als Slave neu bereitgestellt.
Mehrere externe Speichergeräte
Ab Android 4.4 werden Entwicklern über Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
und Context.getObbDirs()
mehrere externe Speichergeräte angezeigt.
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 ihren paketspezifischen Verzeichnissen, sofern dies durch synthetisierte Berechtigungen zulässig ist. Durch die Einschränkung von Schreibvorgängen auf diese Weise kann das System Dateien bereinigen, wenn Anwendungen deinstalliert werden.
Unterstützung von USB-Medien
Android 6.0 unterstützt tragbare Speichergeräte, die nur für kurze Zeit mit dem Gerät verbunden sind, z. B. USB-Speicher. Wenn ein Nutzer ein neues tragbares Gerät einsteckt, wird auf der Plattform eine Benachrichtigung angezeigt, über die er den Inhalt dieses Geräts kopieren oder verwalten kann.
Unter Android 6.0 wird jedes Gerät, das nicht übernommen wurde, als tragbar betrachtet. Da tragbare Speicher nur für kurze Zeit verbunden sind, werden auf der Plattform keine ressourcenintensiven Vorgänge wie das Scannen von Medien ausgeführt. Drittanbieter-Apps müssen das Storage Access Framework verwenden, um mit Dateien auf einem tragbaren Speicher zu interagieren. Der direkte Zugriff ist aus Datenschutz- und Sicherheitsgründen ausdrücklich blockiert.