Mit dem begrenzten Speicher wird der App-Zugriff auf den externen Speicher eingeschränkt. Ab Android 11 müssen Apps, die auf API 30 oder höher ausgerichtet sind, begrenzten Speicher verwenden. In Android 10 konnten Apps den abgegrenzten Speicher deaktivieren.
App-Zugriffsbeschränkungen
Der befristete Speicher soll die Privatsphäre von App- und Nutzerdaten schützen. Dazu gehört der Schutz von Nutzerinformationen (z. B. Fotometadaten), die Verhinderung, dass Apps Nutzerdateien ohne ausdrückliche Berechtigung ändern oder löschen, und der Schutz sensibler Nutzerdokumente, die in den Downloadordner oder andere Ordner heruntergeladen wurden.
Apps, die den Speicher mit begrenztem Zugriff 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
- Der Schreibzugriff auf Mediendateien anderer Apps ist nur mit der direkten Einwilligung des Nutzers zulässig. Ausnahmen gelten für die Systemgalerie und Apps, die für den Zugriff auf alle Dateien berechtigt sind.
- Kein Lese- oder Schreibzugriff auf die externen App-Datenverzeichnisse anderer Apps
Speicher mit Bereichsbeschränkung mit FUSE verwenden
Android 11 oder höher unterstützt Filesystem in Userspace (FUSE). Dadurch kann das MediaProvider-Modul Dateivorgänge im Nutzerbereich untersuchen und den Zugriff auf Dateien anhand der Richtlinie für allow, deny oder redact steuern. Apps mit freigegebenem Speicher, die FUSE verwenden, erhalten die Datenschutzfunktionen des freigegebenen Speichers und die Möglichkeit, über einen direkten Dateipfad auf Dateien zuzugreifen. Die Datei-APIs funktionieren in Apps weiterhin.
Android 10 erzwingt Regeln für beschränkten Speicher für Dateizugriffe durch MediaProvider, jedoch nicht für den direkten Dateipfadzugriff (z. B. mit File API und NDK APIs), da das Abfangen von Kernel-Aufrufen erforderlich ist. Daher konnten Apps mit beschränktem Speicherplatz nicht über einen direkten Dateipfad auf Dateien zugreifen. Diese Einschränkung hat die Anpassungsfähigkeit von App-Entwicklern beeinträchtigt, da erhebliche Codeänderungen erforderlich waren, um den Zugriff der File API auf die MediaProvider API neu zu schreiben.
FUSE und SDCardFS
Die Unterstützung von FUSE unter Android 11 hat nichts mit der Einstellung von SDCardFS zu tun, bietet aber eine Alternative zum Media Store für Geräte, auf denen zuvor SDCardFS verwendet wurde. Geräte:
- Beim Starten mit Android 11 oder höher mit Kernel 5.4 oder höher kann SDCardFS nicht verwendet werden.
- Wenn Sie auf Android 11 oder höher umstellen, können Sie FUSE über SDCardFS hosten, um die Dateivorgänge abzufangen und die Datenschutzziele zu erfüllen.
FUSE-Leistung optimieren
Android unterstützte FUSE bisher unter Android 7 oder niedriger, wobei externer Speicher als FUSE bereitgestellt wurde. Aufgrund von Leistungs- und Deadlock-Problemen mit dieser FUSE-Implementierung wurde in 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 angepasst werden kann, um die Leistungsprobleme unter Android 7 oder niedriger zu beheben.
Die FUSE-Optimierung umfasst die folgenden Optimierungen:
- Umgehung von FUSE für die Verzeichnisse
Android/data
undAndroid/obb
zur Leistungssteigerung von Spiele-Apps, die auf diese Verzeichnisse angewiesen sind. - Optimierungen (z. B. Anpassung der Vorablese- und Dirty-Ratios des FUSE-Dateisystems), um die Leseleistung aufrechtzuerhalten und die Medienwiedergabe flüssig zu gestalten.
- Verwenden des FUSE-Writeback-Cache
- Caching von Berechtigungen, um die Anzahl der IPCs an den Systemserver zu reduzieren.
- Optimierungen für Apps mit Zugriff auf alle Dateien, um Bulk-Vorgänge zu beschleunigen.
Mit den oben genannten Optimierungen lässt sich die Leistung von FUSE- und Nicht-FUSE-Geräten vergleichen. Wenn Sie beispielsweise ein abgestimmtes Pixel 2 mit FUSE und ein Pixel 2 mit Media Store testen, ergab sich eine vergleichbare sequenzielle Leseleistung (z. B. Videowiedergabe) zwischen Dateipfadzugriff und Media Store. Sequenzielle Schreibvorgänge waren mit FUSE jedoch etwas schlechter 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 gleichbleibendste Leistung bieten, sollten App-Entwickler, die auf die Leistung achten, diese APIs für ihre Apps verwenden.
Auswirkungen von FUSE auf die Leistung minimieren
Die Auswirkungen von FUSE auf die Leistung sind nur bei Nutzern mit hohem Datenaufkommen auf externem freigegebenem Speicherplatz zu spüren. Externer privater 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 verschlüsselt und sicher speichern) nicht über FUSE bereitgestellt wird.
Apps, die den freigegebenen externen Speicher nur wenig nutzen, interagieren häufig mit einer begrenzten Anzahl von Dateien (in der Regel weniger als 100 Dateien). Diese Apps profitieren von bestehenden Optimierungen für gängige Lese- und Schreibvorgänge und sollten in Android 11 keine FUSE-bezogenen Leistungseinbußen haben.
Anwendungen, die viel externen Speicher nutzen, führen in der Regel Bulk-Dateivorgänge aus. Dazu zählen 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 die Berechtigung
MANAGE_EXTERNAL_STORAGE
haben, profitieren sie von den Leistungsoptimierungen, die im Update vom Oktober 2020 enthalten sind.
Um den Leistungsoverhead von FUSE zu vermeiden, können Apps Daten in externem privaten Speicher speichern oder Bulk-APIs in der ContentProvider
-Klasse 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. Sicherung/Wiederherstellung, Antivirensoftware), die die Berechtigung MANAGE_EXTERNAL_STORAGE
haben.
Datenschutz vor Leistung
Auf Geräten, die für FUSE optimiert wurden, sind die meisten kritischen Nutzerinteraktionen unter Android 10 und Android 11 gleich leistungsfähig. Beim Testen von Benchmarks an einer Reihe von Dateivorgängen schneidet Android 11 jedoch möglicherweise schlechter als Android 10 ab. Bei Dateizugriffsmustern, die unter Android 11 eine schlechtere Leistung erzielen (z. B. zufällige Lese- oder Schreibvorgänge), empfehlen wir die Verwendung von MediaProvider APIs, um Apps einen Zugriffsmodus ohne FUSE zuzuweisen. Dies ist die beste und zuverlässigste Option.
Updates für MediaProvider und FUSE
Das Verhalten der Systemkomponente MediaProvider unterscheidet sich zwischen den Android-Releases.
In Android 10 und niedriger war SDCardFS das Dateisystem und MediaProvider stellte eine Schnittstelle für Dateisammlungen (z. B. Bilder, Videos, Musikdateien usw.) bereit. Wenn eine App eine Datei mit der File API erstellt hat, kann sie MediaProvider bitten, die Datei zu scannen und in der Datenbank zu speichern.
In Android 11 und höher wurde SDCardFS eingestellt. MediaProvider wird zum Dateisystem-Handler (für FUSE) für externen Speicher, wodurch das Dateisystem im externen Speicher und die MediaProvider-Datenbank einheitlich werden. Als Userspace-Handler für das FUSE-Dateisystem kann MediaProvider Kernelaufrufe abfangen und dafür sorgen, dass die Dateivorgänge datenschutzfreundlich sind.
Unter Android 11 und höher ist MediaProvider auch eine modulare Systemkomponente (Mainline-Modul), die außerhalb von Android-Releases aktualisiert werden kann. Das bedeutet, dass Leistungs-, Datenschutz- oder Sicherheitsprobleme in MediaProvider behoben und über den Google Play Store oder andere vom Partner bereitgestellte Mechanismen per WLAN bereitgestellt werden können. Alles, was von einem FUSE-Handler erwartet wird, kann ebenfalls aktualisiert werden. So können Updates Leistungseinbrüche und Fehler bei FUSE beheben.