Speicherplatz mit Begrenzung

Mit dem eingeschränkten Speicherzugriff wird der App-Zugriff auf externen Speicher begrenzt. In Android 11 oder höher müssen Apps, die auf API 30 oder höher ausgerichtet sind, den begrenzten Speicher verwenden. Bisher konnten Apps in Android 10 den begrenzten Speicher deaktivieren.

Einschränkungen für den App-Zugriff

Ziel des eingeschränkten Speicherzugriffs 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 den eingeschränkten Speicherzugriff 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 Nutzereinwilligung 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 externe App-Datenverzeichnisse anderer Apps

Begrenzten Speicher mit FUSE verwenden

Android 11 oder höher unterstützt FUSE (Filesystem in Userspace) . Damit kann das MediaProvider-Modul Dateivorgänge im Nutzerbereich untersuchen und den Zugriff auf Dateien basierend auf der Richtlinie allow, deny, oder redact steuern. Apps mit begrenztem Speicherzugriff, die FUSE verwenden, profitieren von den Datenschutzfunktionen des begrenzten Speicherzugriffs und können über einen direkten Dateipfad auf Dateien zugreifen. So funktionieren Datei-APIs weiterhin in Apps.

In Android 10 wurden die Regeln für den Zugriff auf den begrenzten Speicher 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 sehr aufwendig ist. Daher konnten Apps mit eingeschränktem Speicherzugriff nicht über einen direkten Dateipfad auf Dateien zugreifen. Diese Einschränkung erschwerte die Anpassung für App-Entwickler, da erhebliche Codeänderungen erforderlich waren, um den Zugriff über die File API auf die MediaProvider API umzustellen.

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 mit Android 11 oder höher und Kernel 5.4 oder höher auf den Markt kommen, können SDCardFS nicht verwenden.
  • Bei einem 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

Android unterstützte FUSE bereits in Android 7 oder niedriger, wobei der externe Speicher als FUSE eingebunden 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 wieder eingeführt. Dabei wird eine verbesserte, besser getestete Implementierung von libfuse verwendet, die optimiert werden kann, um die Leistungsprobleme in Android 7 oder niedriger zu beheben.

Die FUSE-Optimierung umfasst die folgenden Anpassungen:

  • Umgehen von FUSE für die Verzeichnisse Android/data und Android/obb, um die Leistung für Spiele-Apps zu verbessern, die auf diese Verzeichnisse angewiesen sind.
  • Optimierungen (z. B. Anpassung der Read-Ahead- und Dirty-Verhältnisse des FUSE-Dateisystems), um Lesevorgänge leistungsstark und die Medienwiedergabe reibungslos zu gestalten.
  • Verwendung des FUSE-Write-Back-Cache.
  • Caching von Berechtigungen, um 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 Tests mit 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 dem 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.

Die Leistungsmessungen können sich je nach Gerät und Anwendungsfall unterscheiden. Da MediaProvider-APIs die konsistenteste Leistung bieten, sollten App-Entwickler, die Wert auf Leistung legen, MediaProvider-APIs für ihre Apps verwenden.

Auswirkungen von FUSE auf die Leistung minimieren

Die Auswirkungen von FUSE auf die Leistung sind nur auf Nutzer beschränkt, die häufig Dateien verwenden, die auf gemeinsam genutztem externen Speicher gespeichert sind. 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, wo viele Apps Daten verschlüsselt und sicher speichern) nicht mit FUSE eingebunden wird.

  • Apps, die gemeinsam genutzten externen Speicher nur wenig nutzen, interagieren oft mit einer begrenzten Anzahl von Dateien (in der Regel weniger als 100 Dateien). Diese Apps profitieren von den vorhandenen Optimierungen für häufige Lese- und Schreibvorgänge und sollten in Android 11 keine FUSE-bedingten Leistungseinbußen feststellen.

  • Apps, die gemeinsam genutzten externen Speicher häufig nutzen, führen in der Regel Bulk-Dateivorgänge 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 in 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. Darüber hinaus enthält das Update vom Oktober 2020 für die MediaProvider-Systemkomponente Leistungsoptimierungen für Dateimanager und ähnliche Apps (z. B. Sicherung/Wiederherstellung, Antivirus), die die Berechtigung MANAGE_EXTERNAL_STORAGE haben.

Datenschutz vor Leistung

Auf Geräten, die für FUSE optimiert wurden, ist die Leistung der wichtigsten Nutzerpfade zwischen Android 10 und Android 11 vergleichbar. Bei Benchmark-Tests mit einer Reihe von Dateivorgängen kann Android 11 jedoch schlechter abschneiden als Android 10. Für Dateizugriffsmuster, die in 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 MediaProvider-Systemkomponente unterscheidet sich zwischen den Android-Versionen.

  • 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 bitten, die Datei zu scannen und in der Datenbank zu speichern.

  • In Android 11 oder höher, SDCardFS ist veraltet und MediaProvider wird zum Dateisystem-Handler (für FUSE) für externen Speicher. So werden das Dateisystem auf dem externen Speicher und die MediaProvider-Datenbank konsistent. Als Userspace-Handler für das FUSE-Dateisystem kann MediaProvider Kernel-Aufrufe abfangen und sicherstellen, dass die Dateivorgänge datenschutzkonform sind.

In Android 11 und höher ist MediaProvider auch eine modulare Systemkomponente (ein Mainline-Modul), die außerhalb 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 im Rahmen der Erwartungen an einen FUSE-Handler liegt, kann ebenfalls aktualisiert werden. So können Updates zur Behebung von FUSE-Leistungseinbußen und ‑Fehlern bereitgestellt werden.