Lager

HAL-Symbol für externen Android-Speicher

Android hat sich im Laufe der Zeit weiterentwickelt, um eine Vielzahl von Speichergerätetypen und -funktionen zu unterstützen. Alle Versionen von Android - Unterstützung Geräten mit herkömmlichen Speichern , die tragbar und emulierten Speicher enthalten. Tragbare Speicher können durch physikalische Medien, wie eine SD-Karte oder USB zur Verfügung gestellt werden, die für die temporären Datenübertragung / Dateispeicher ist. Das physische Medium kann über einen längeren Zeitraum mit dem Gerät verbleiben, ist jedoch nicht an das Gerät gebunden und kann entfernt werden. SD-Karten sind seit Android 1.0 als tragbarer Speicher verfügbar; Android 6.0 hat USB-Unterstützung hinzugefügt. Emulierten Speicher wird durch Aussetzen eines Teils der internen Speicher durch eine Emulationsschicht zur Verfügung gestellt und ist seit Android 3.0 zur Verfügung.

Ab Android 6.0 unterstützt Android adoptable Lagerung , die durch physikalische Medien zur Verfügung gestellt, wie eine SD-Karte oder USB, die verschlüsselt ist und verhalten sich wie interne Speicher formatiert. Annehmbarer Speicher kann alle Arten von Anwendungsdaten speichern.

Berechtigungen

Der Zugriff auf externen Speicher ist durch verschiedene Android-Berechtigungen geschützt. Ab Android 1.0, Schreibzugriff wird mit der geschützten WRITE_EXTERNAL_STORAGE Erlaubnis. Ab Android 4.1, Lesezugriff wird mit der geschützten READ_EXTERNAL_STORAGE Erlaubnis.

Ab Android 4.4 werden Besitzer, Gruppe und Modi von Dateien auf externen Speichergeräten jetzt basierend auf der Verzeichnisstruktur synthetisiert. Dies ermöglicht Anwendungen ihre paketspezifische Verzeichnisse auf externen Speicher zu verwalten , ohne dass sie die breite halten WRITE_EXTERNAL_STORAGE Erlaubnis. Zum Beispiel kann die App mit Paketnamen com.example.foo kann nun Zugriff auf frei Android/data/com.example.foo/ auf externen Speichergeräten ohne Berechtigungen. Diese synthetisierten Berechtigungen werden durch Einschließen von Rohspeichergeräten in einen FUSE-Daemon erreicht.

Ab Android 10, Apps, deren Ziel Android 9 und unteren Standard auf Legacy - Speicher und können sich in getrennte Lagerung entscheiden. Apps , dass Ziel Android 10 und standardmäßig getrennte Lagerung kann es vorübergehend deaktivieren. Verwenden Sie das manifest Attribut requestLegacyExternalStorage , der das Speichermodell steuert, um den Standardzustand zu ändern.

Da beide READ_EXTERNAL_STORAGE und WRITE_EXTERNAL_STORAGE Berechtigungen sind weich beschränkt, wenn das Installationsprogramm nicht tat weiße Liste des App, den Zugang der Erlaubnis Kontrollen auf die akustischen und visuellen Sammlungen nur, ohne Zugriff auf die SD - Karte. Dies gilt auch dann, wenn die App Legacy-Speicher anfordert. Weitere Informationen zu den beiden harten Einschränkungen und weichen Einschränkungen finden Harte und weiche Einschränkungen im Android 10 .

Wenn das Installationsprogramm die Berechtigung auf die weiße Liste gesetzt hat, erhält eine im Legacy-Modus ausgeführte App das nicht isolierte Berechtigungsverhalten. Die Berechtigung steuert den Zugriff auf die SD-Karte sowie die akustischen und visuellen Sammlungen. Dies geschieht, wenn die App entweder auf Android 9 oder niedriger ausgerichtet ist und sich nicht für isolierten Speicher anmeldet, oder wenn sie auf Android 10 abzielt und sich abmeldet.

Der Status der Whitelist kann nur bei der Installation angegeben werden und kann nicht geändert werden, bis die App installiert wurde.

Weitere Informationen über die Einstellung READ_EXTERNAL_STORAGE Erlaubnis, siehe setWhitelistedRestrictedPermissions() in der PackageInstaller.SessionParams Klasse.

Laufzeitberechtigungen

Android 6.0 führt ein neues Laufzeit - Berechtigungen Modell , in den Apps - Funktionen anfordern , wenn zur Laufzeit benötigt. Da das neue Modell beinhaltet die READ/WRITE_EXTERNAL_STORAGE Berechtigungen, Zugriff der Plattform Anforderungen dynamisch Erteilung Speicher , ohne zu töten oder Neustart bereits laufende Anwendungen. Dies geschieht durch die Beibehaltung von drei unterschiedlichen Ansichten aller gemounteten Speichergeräte:

  • /mnt/runtime/default ist ohne spezielle Speicherberechtigungen und in dem Stammnamespace - Anwendungen gezeigt , wo adbd und andere Systemkomponenten leben.
  • /mnt/runtime/read auf Anwendungen mit gezeigt READ_EXTERNAL_STORAGE (Set LEGACY_STORAGE für Android 10)
  • /mnt/runtime/write auf Anwendungen mit gezeigt WRITE_EXTERNAL_STORAGE

Zur Zeit der Zygote-Fork erstellen wir einen Mount-Namespace für jede laufende App und binden die entsprechende anfängliche Ansicht an ihren Platz. Später, als Laufzeit - Berechtigungen erteilt werden, vold springt in den Mount - Namespace von bereits laufenden Anwendungen und Bind Mounts die aktualisierte Ansicht hinein. Beachten Sie, dass Berechtigungs-Downgrades immer dazu führen, dass die App beendet wird.

Die setns() Funktionalität verwendet , um dieses Feature zu implementieren , erfordert mindestens Linux 3.8, aber Patches erfolgreich auf Linux 3.4 zurückportiert wurde. Der PermissionsHostTest CTS - Test kann verwendet werden , um korrektes Kernel - Verhalten zu überprüfen.