
Android hat sich im Laufe der Zeit weiterentwickelt, um eine Vielzahl von Speichergerätetypen und -funktionen zu unterstützen. Alle Versionen von Android unterstützen Geräte mit herkömmlichem Speicher , einschließlich tragbarem und emuliertem Speicher. Tragbarer Speicher kann durch physische Medien wie eine SD-Karte oder USB bereitgestellt werden, das heißt für die temporäre Datenübertragung/Dateispeicherung. Das physische Medium kann längere Zeit im 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. Emulierter Speicher wird bereitgestellt, indem ein Teil des internen Speichers durch eine Emulationsschicht verfügbar gemacht wird, und ist seit Android 3.0 verfügbar.
Ab Android 6.0 unterstützt Android anpassbaren Speicher , der von physischen Medien wie einer SD-Karte oder USB bereitgestellt wird, die verschlüsselt und so formatiert sind, dass sie sich wie ein interner Speicher verhalten. Adoptable Storage kann alle Arten von Anwendungsdaten speichern.
Berechtigungen
Der Zugriff auf den externen Speicher ist durch verschiedene Android-Berechtigungen geschützt. Ab Android 1.0 ist der Schreibzugriff durch die WRITE_EXTERNAL_STORAGE
geschützt. Ab Android 4.1 ist der Lesezugriff mit der READ_EXTERNAL_STORAGE
geschützt.
Ab Android 4.4 werden der Besitzer, die Gruppe und die Modi von Dateien auf externen Speichergeräten jetzt basierend auf der Verzeichnisstruktur synthetisiert. Dadurch können Apps ihre paketspezifischen Verzeichnisse auf externem Speicher verwalten, ohne dass sie die umfassende Berechtigung WRITE_EXTERNAL_STORAGE
. Beispielsweise kann die App mit dem Paketnamen com.example.foo
jetzt ohne Berechtigungen auf Android/data/com.example.foo/
auf externen Speichergeräten zugreifen. Diese synthetisierten Berechtigungen werden erreicht, indem Rohspeichergeräte in einen FUSE-Daemon eingeschlossen werden.
Ab Android 10 verwenden Apps, die auf Android 9 und niedriger abzielen, standardmäßig Legacy-Speicher und können sich für isolierten Speicher entscheiden . Apps, die auf Android 10 abzielen und standardmäßig auf isolierten Speicher setzen, können sich vorübergehend davon abmelden . Verwenden Sie das Manifestattribut requestLegacyExternalStorage
, das das Speichermodell steuert, um den Standardzustand zu ändern.
Da sowohl READ_EXTERNAL_STORAGE
als auch die WRITE_EXTERNAL_STORAGE
-Berechtigungen weich eingeschränkt sind, steuert die Berechtigung, wenn das Installationsprogramm die App nicht auf die Whitelist gesetzt hat, nur den Zugriff auf die akustischen und visuellen Sammlungen, ohne Zugriff auf die SD-Karte. Dies gilt auch dann, wenn die App Legacy-Speicher anfordert. Weitere Informationen zu harten und weichen Einschränkungen finden Sie unter Harte und weiche Einschränkungen in Android 10 .
Wenn das Installationsprogramm die Berechtigung auf die weiße Liste gesetzt hat, erhält eine App, die im Legacy-Modus ausgeführt wird, 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 abzielt und sich nicht für isolierten Speicher entscheidet oder wenn sie auf Android 10 abzielt und sich abmeldet.
Der Whitelist-Status kann nur zum Zeitpunkt der Installation angegeben werden und kann nicht geändert werden, bis die App installiert wurde.
Weitere Informationen zum Festlegen der READ_EXTERNAL_STORAGE
Berechtigung finden Sie unter setWhitelistedRestrictedPermissions()
in der PackageInstaller.SessionParams -Klasse.
Laufzeitberechtigungen
Android 6.0 führt ein neues Laufzeitberechtigungsmodell ein, bei dem Apps bei Bedarf zur Laufzeit Funktionen anfordern. Da das neue Modell die READ/WRITE_EXTERNAL_STORAGE
Berechtigungen enthält, muss die Plattform Speicherzugriff dynamisch gewähren, ohne bereits ausgeführte Apps zu beenden oder neu zu starten. Dazu werden drei unterschiedliche Ansichten aller gemounteten Speichergeräte beibehalten:
-
/mnt/runtime/default
wird Apps ohne spezielle Speicherberechtigungen und dem Root-Namespace angezeigt, in dem sichadbd
und andere Systemkomponenten befinden. -
/mnt/runtime/read
wird Apps mitREAD_EXTERNAL_STORAGE
(LEGACY_STORAGE
für Android 10 festlegen) -
/mnt/runtime/write
wird Apps mitWRITE_EXTERNAL_STORAGE
Zur Zygote-Fork-Zeit erstellen wir einen Mount-Namespace für jede laufende App und binden den Mount an die entsprechende Anfangsansicht. Später, wenn Laufzeitberechtigungen erteilt werden, springt vold
in den Mount-Namespace von bereits ausgeführten Apps und bind stellt die aktualisierte Ansicht an Ort und Stelle bereit. Beachten Sie, dass Berechtigungsherabstufungen immer dazu führen, dass die App beendet wird.
Die zum Implementieren dieser Funktion verwendete setns()
-Funktionalität erfordert mindestens Linux 3.8, aber Patches wurden erfolgreich auf Linux 3.4 zurückportiert. Der PermissionsHostTest
CTS-Test kann verwendet werden, um das korrekte Kernel-Verhalten zu überprüfen.