Der begrenzte Speicher schränkt den App-Zugriff auf externen Speicher ein. Unter Android 11 oder höher müssen Apps, die auf API 30 oder höher ausgerichtet sind, scoped storage verwenden. Bisher konnten Apps unter Android 10 die Verwendung von Scoped Storage deaktivieren.
App-Zugriffsbeschränkungen
Das Ziel von „Scoped Storage“ ist es, die Privatsphäre von App- und Nutzerdaten zu schützen. Dazu gehört der Schutz von Nutzerinformationen (z. B. Fotometadaten), das Verhindern, dass Apps Nutzerdateien ohne ausdrückliche Berechtigung ändern oder löschen, und der Schutz vertraulicher Nutzerdokumente, die in den Ordner „Downloads“ oder andere Ordner heruntergeladen wurden.
Apps, die scoped storage verwenden, können die folgenden Zugriffsebenen haben (der tatsächliche Zugriff ist implementierungsspezifisch).
- Lese- und Schreibzugriff auf eigene Dateien ohne Berechtigungen
- Lesezugriff auf Mediendateien anderer Apps mit der Berechtigung
READ_EXTERNAL_STORAGE
- Schreibzugriff auf Mediendateien anderer Apps ist nur mit direkter Einwilligung des Nutzers zulässig. Ausnahmen gelten für die Systemgalerie und Apps, die für den Zugriff auf alle Dateien infrage kommen.
- Kein Lese- oder Schreibzugriff auf die externen App-Datenverzeichnisse anderer Apps
Scoped Storage mit FUSE verwenden
Android 11 und höher unterstützt FUSE (Filesystem in Userspace), wodurch das MediaProvider-Modul Dateivorgänge im Nutzerbereich untersuchen und den Zugriff auf Dateien basierend auf der Richtlinie auf allow (zulassen), deny (verweigern) oder redact (schwärzen) festlegen kann. Apps mit begrenztem Speicher, die FUSE verwenden, profitieren von den Datenschutzfunktionen des begrenzten Speichers und können über einen direkten Dateipfad auf Dateien zugreifen. So funktionieren Datei-APIs in Apps weiterhin.
Unter Android 10 wurden Regeln für den begrenzten Speicherzugriff auf Dateizugriffe durch MediaProvider erzwungen, nicht aber für den direkten Dateipfadzugriff (z. B. mit der File API und NDK-APIs), da das Abfangen von Kernel-Aufrufen mit einem hohen Aufwand verbunden ist. Daher konnten Apps mit eingeschränktem Speicherplatz nicht über einen direkten Dateipfad auf Dateien zugreifen. Diese Einschränkung hat die Möglichkeiten von App-Entwicklern, sich anzupassen, erheblich eingeschränkt, da umfangreiche Codeänderungen erforderlich waren, um den Zugriff auf die File API in die MediaProvider API umzuschreiben.
FUSE und SDCardFS
Die Android 11-Unterstützung für FUSE steht nicht im Zusammenhang mit der Einstellung von SDCardFS, bietet aber eine Alternative zum Media Store für Geräte, die zuvor SDCardFS verwendet haben. Geräte:
- Geräte, die bei Markteinführung Android 11 oder höher mit Kernel 5.4 oder höher nutzen, können SDCardFS nicht verwenden.
- Beim Upgrade auf Android 11 oder höher kann FUSE auf SDCardFS gehostet werden, um die Dateivorgänge abzufangen und die Datenschutzziele zu erreichen.
FUSE-Leistung optimieren
Unter Android 7 oder niedriger wurde FUSE unterstützt, wobei externer Speicher als FUSE bereitgestellt wurde. Aufgrund von Leistungs- und Deadlock-Problemen mit dieser FUSE-Implementierung wurde mit Android 8 SDCardFS eingeführt. In Android 11 wird die Unterstützung für FUSE mit einer verbesserten, besser getesteten Implementierung von libfuse
wieder eingeführt, die so angepasst werden kann, dass die Leistungsprobleme in Android 7 oder niedriger behoben werden.
Die FUSE-Optimierung umfasst die folgenden Anpassungen:
- Umgehen von FUSE für die Verzeichnisse
Android/data
undAndroid/obb
, um die Leistung von Spiele-Apps zu verbessern, die auf diese Verzeichnisse angewiesen sind. - Optimierungen (z. B. das Anpassen der Read-Ahead- und Dirty-Verhältnisse des FUSE-Dateisystems), um Lesevorgänge leistungsstark und die Medienwiedergabe flüssig zu halten.
- FUSE-Write-Back-Cache verwenden.
- Berechtigungen werden im Cache gespeichert, um die Anzahl der IPCs zum Systemserver zu reduzieren.
- Optimierungen für Apps mit Zugriff auf alle Dateien, um Bulk-Vorgänge zu beschleunigen.
Mit den oben genannten Optimierungen kann eine vergleichbare Leistung zwischen FUSE- und Nicht-FUSE-Geräten erzielt werden. Bei einem optimierten Pixel 2 mit FUSE und einem Pixel 2 mit Media Store wurde beispielsweise eine vergleichbare sequenzielle Leseleistung (z. B. bei der Videowiedergabe) zwischen dem Zugriff über den Dateipfad und Media Store festgestellt. Sequenzielle Schreibvorgänge waren mit FUSE jedoch etwas langsamer und zufällige Lese- und Schreibvorgänge konnten bis zu doppelt so langsam sein.
Leistungsmessungen können sich von Gerät zu Gerät und zwischen bestimmten Anwendungsfällen ändern. Da MediaProvider-APIs die konsistenteste Leistung bieten, sollten App-Entwickler, die sich um die Leistung sorgen, MediaProvider-APIs für ihre Apps verwenden.
Auswirkungen von FUSE auf die Leistung minimieren
Die Auswirkungen auf die FUSE-Leistung sind nur auf Nutzer beschränkt, die Dateien, die auf externem gemeinsam genutzten Speicher gespeichert sind, intensiv nutzen. Der externe private-Speicher (einschließlich der Verzeichnisse android/data
und android/obb
) wird von FUSE umgangen, während der interne Speicher (z. B. /data/data
, in dem viele Apps Daten speichern, um sie verschlüsselt und sicher zu halten) nicht mit FUSE bereitgestellt wird.
Apps, die den freigegebenen externen Speicher nur wenig nutzen, interagieren oft mit einer begrenzten Anzahl von Dateien (in der Regel weniger als 100 Dateien). Diese Apps profitieren von vorhandenen Optimierungen häufiger Lese- und Schreibvorgänge und sollten unter Android 11 keine FUSE-bedingten Leistungseinbußen aufweisen.
Apps, die den freigegebenen externen Speicher intensiv nutzen, führen in der Regel Massenoperationen für Dateien aus, z. B. das Auflisten oder Entfernen eines Verzeichnisses mit 1.000 Dateien oder das Erstellen oder Löschen eines Verzeichnisses mit einer Million Dateien im Dateisystem. Bulk-Dateivorgänge können unter Android 11 von FUSE beeinträchtigt werden. Wenn solche Apps jedoch für die Berechtigung
MANAGE_EXTERNAL_STORAGE
infrage kommen, profitieren sie von den Leistungsoptimierungen, die im Update vom Oktober 2020 enthalten sind.
Um den FUSE-Leistungs-Overhead zu vermeiden, können Apps Daten im externen privaten Speicher speichern oder Bulk-APIs in der Klasse ContentProvider
verwenden, um FUSE zu umgehen und einen leistungsoptimierten Pfad zu erhalten. Außerdem enthält das Update der Systemkomponente „MediaProvider“ vom Oktober 2020 Leistungsoptimierungen für Dateimanager und ähnliche Apps (z. B. für Sicherung/Wiederherstellung, Antivirus), die die Berechtigung MANAGE_EXTERNAL_STORAGE
haben.
Datenschutz vor Leistung
Auf Geräten, die für FUSE optimiert wurden, sind die meisten wichtigen Nutzerverhaltensschemata unter Android 10 und Android 11 gleich leistungsstark. Wenn Sie jedoch Benchmarks für eine Reihe von Dateivorgängen testen, kann die Leistung unter Android 11 schlechter sein als unter Android 10. Für Dateizugriffsmuster, die unter Android 11 schlechter abschneiden (z. B. zufällige Lese- oder Schreibvorgänge), empfehlen wir die Verwendung von MediaProvider-APIs, um Apps einen Nicht-FUSE-Zugriffsmodus zu ermöglichen. Dies ist die beste und konsistent leistungsstarke Option.
MediaProvider- und FUSE-Updates
Das Verhalten der Systemkomponente MediaProvider unterscheidet sich je nach Android-Version.
In Android 10 und niedriger war SDCardFS das Dateisystem und MediaProvider bot eine Schnittstelle zu Sammlungen von Dateien (z. B. Bilder, Videos, Musikdateien usw.). Wenn eine App eine Datei mit der File API erstellt hat, konnte sie MediaProvider auffordern, die Datei zu scannen und in der Datenbank zu speichern.
In Android 11 oder höher ist SDCardFS veraltet und MediaProvider wird zum Dateisystem-Handler (für FUSE) für externen Speicher. Dadurch wird das Dateisystem auf dem externen Speicher und die MediaProvider-Datenbank konsistent. Als Nutzerbereichs-Handler für das FUSE-Dateisystem kann MediaProvider Kernel-Aufrufe abfangen und dafür sorgen, dass die Dateivorgänge datenschutzkonform sind.
In Android 11 und höher ist MediaProvider auch eine modulare Systemkomponente (ein Mainline-Modul), die unabhängig von Android-Releases aktualisiert werden kann. Das bedeutet, dass Leistungs-, Datenschutz- oder Sicherheitsprobleme, die in MediaProvider gefunden werden, behoben und Over-the-Air über den Google Play Store oder andere von Partnern bereitgestellte Mechanismen bereitgestellt werden können. Alles, was von einem FUSE-Handler erwartet wird, kann auch aktualisiert werden, um FUSE-Leistungsregressionen und ‑Fehler zu beheben.