Speicher mit begrenztem Umfang

Der begrenzte Speicher beschränkt den App-Zugriff auf externen Speicher. In Android 11 oder höher müssen Apps, die auf API 30 oder höher abzielen, bereichsbezogenen Speicher verwenden. Bisher konnten Apps in Android 10 den begrenzten Speicher deaktivieren.

App-Zugriffsbeschränkungen

Das Ziel der bereichsbezogenen Speicherung besteht darin, die Privatsphäre von App- und Benutzerdaten zu schützen. Dazu gehört der Schutz von Benutzerinformationen (z. B. Fotometadaten), das Verhindern, dass Apps ohne ausdrückliche Genehmigung Benutzerdateien ändern oder löschen, und der Schutz vertraulicher Benutzerdokumente, die in Download- oder andere Ordner heruntergeladen werden.

Apps, die bereichsbezogenen Speicher verwenden, können die folgenden Zugriffsebenen haben (der tatsächliche Zugriff ist Implementierungsspezifisch).

  • Lese- und Schreibzugriff auf die eigenen Dateien ohne Berechtigungen
  • Lesezugriff auf die Mediendateien anderer Apps mit der Berechtigung READ_EXTERNAL_STORAGE
  • Der Schreibzugriff auf die Mediendateien anderer Apps ist nur mit direkter Zustimmung des Benutzers 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

Verwenden Sie bereichsbezogenen Speicher mit FUSE

Android 11 oder höher unterstützt Filesystem in Userspace (FUSE), wodurch das MediaProvider-Modul Dateivorgänge im Userspace untersuchen und den Zugriff auf Dateien basierend auf der Richtlinie zum Zulassen , Verweigern oder Schwärzen des Zugriffs sperren kann. Apps im bereichsbezogenen Speicher, die FUSE verwenden, erhalten die Datenschutzfunktionen des bereichsbezogenen Speichers und die Möglichkeit, über einen direkten Dateipfad auf Dateien zuzugreifen (wodurch Datei-APIs in Apps funktionieren).

Android 10 erzwang bereichsbezogene Speicherregeln für Dateizugriffe durch MediaProvider, jedoch nicht für den direkten Dateipfadzugriff (z. B. mithilfe der Datei-API und NDK-APIs), da das Abfangen von Kernel-Aufrufen einen hohen Aufwand erfordert. Daher konnten Apps im Bereichsspeicher nicht über einen direkten Dateipfad auf Dateien zugreifen. Diese Einschränkung beeinträchtigte die Anpassungsfähigkeit von App-Entwicklern, da erhebliche Codeänderungen erforderlich waren, um den Datei-API-Zugriff auf die MediaProvider-API neu zu schreiben.

FUSE und SDCardFS

Die Android 11-Unterstützung für FUSE steht in keinem Zusammenhang mit der Einstellung von SDCardFS , bietet jedoch eine Alternative zum Media Store für Geräte, die zuvor SDCardFS verwendet haben. Geräte:

  • Beim Starten mit Android 11 oder höher mit Kernel 5.4 oder höher kann SDCardFS nicht verwendet werden.
  • Durch ein Upgrade auf Android 11 oder höher kann FUSE zusätzlich zu SDCardFS gehostet werden, um Dateivorgänge abzufangen und Datenschutzziele zu erreichen.

FUSE-Leistungsoptimierung

Android unterstützte FUSE zuvor in Android 7 oder niedriger, in dem externer Speicher als FUSE bereitgestellt wurde. Aufgrund von Leistungs- und Deadlock-Problemen bei dieser FUSE-Implementierung führte Android 8 SDCardFS ein. Android 11 führt die Unterstützung für FUSE mithilfe einer verbesserten, besser getesteten Implementierung von libfuse wieder ein, die optimiert werden kann, um die Leistungsprobleme in Android 7 oder niedriger zu beheben.

Das FUSE-Tuning umfasst die folgenden Optimierungen:

  • Umgehen von FUSE für die Verzeichnisse Android/data und Android/obb , um die Leistung von Spiele-Apps zu verbessern, die auf diese Verzeichnisse angewiesen sind.
  • Optimierungen (z. B. Optimierung der Read-Ahead- und Dirty-Verhältnisse des FUSE-Dateisystems), um die Leseleistung und die Medienwiedergabe reibungslos zu halten.
  • Verwendung des FUSE-Rückschreibcaches.
  • Caching-Berechtigungen zur Reduzierung von IPCs auf dem Systemserver.
  • Optimierungen für Apps mit Zugriff auf alle Dateien, um Massenvorgänge zu beschleunigen.

Die oben genannten Optimierungen können zu einer vergleichbaren Leistung zwischen FUSE- und Nicht-FUSE-Geräten führen. Beim Testen eines optimierten Pixel 2 mit FUSE und eines Pixel 2 mit Media Store wurde beispielsweise eine vergleichbare sequentielle Leseleistung (z. B. Videowiedergabe) zwischen Dateipfadzugriff und Media Store festgestellt. Allerdings waren sequentielle Schreibvorgänge mit FUSE etwas schlechter und zufällige Lese- und Schreibvorgänge konnten bis zu doppelt so langsam sein.

Leistungsmessungen können von Gerät zu Gerät und zwischen bestimmten Anwendungsfällen variieren. Da MediaProvider-APIs die konsistenteste Leistung bieten, sollten App-Entwickler, die sich Gedanken über die Leistung machen, MediaProvider-APIs für ihre Apps verwenden.

Reduzieren Sie die Auswirkungen auf die FUSE-Leistung

Die Auswirkungen auf die Leistung von FUSE sind nur auf intensive Benutzer von Dateien beschränkt, die auf einem externen gemeinsam genutzten Speicher gespeichert sind. Externer privater Speicher (einschließlich der Verzeichnisse android/data und android/obb ) wird von FUSE umgangen, während interner Speicher (z. B. /data/data , wo viele Apps Daten speichern, um sie verschlüsselt und sicher zu halten) nicht über FUSE bereitgestellt wird.

  • Apps, die selten gemeinsam genutzten externen Speicher nutzen, interagieren häufig mit einer begrenzten Anzahl von Dateien (normalerweise weniger als 100 Dateien). Diese Apps profitieren von bestehenden Optimierungen allgemeiner Lese- und Schreibvorgänge und sollten in Android 11 keine FUSE-bedingten Leistungseinbußen erfahren.

  • Apps, die häufig gemeinsam genutzten externen Speicher nutzen, führen in der Regel Massendateivorgänge durch, z. B. das Auflisten oder Entfernen eines Verzeichnisses mit 1000 Dateien oder das Erstellen oder Löschen eines Verzeichnisses mit einer Million Dateien im Dateisystem. Massendateivorgänge können von FUSE auf Android 11 betroffen sein, aber wenn solche Apps für die Berechtigung MANAGE_EXTERNAL_STORAGE berechtigt sind, profitieren sie von den Leistungsoptimierungen, die im Update vom Oktober 2020 enthalten sind.

Um den Leistungsaufwand von FUSE zu vermeiden, können Apps Daten im externen privaten Speicher speichern oder Massen-APIs in der ContentProvider Klasse verwenden, um FUSE zu umgehen und einen leistungsoptimierten Pfad zu erhalten. Darüber hinaus enthält das Update der MediaProvider-Systemkomponente vom Oktober 2020 Leistungsoptimierungen für Dateimanager und ähnliche Apps (z. B. Sicherung/Wiederherstellung, Antivirus), die über die Berechtigung MANAGE_EXTERNAL_STORAGE verfügen.

Privatsphäre geht vor Leistung

Auf Geräten, die für FUSE optimiert wurden, sind die meisten kritischen User Journeys zwischen Android 10 und Android 11 gleich leistungsstark. Beim Testen von Benchmarks für eine Reihe von Dateivorgängen schneidet Android 11 jedoch möglicherweise schlechter ab als Android 10. Bei Dateizugriffsmustern mit guter Leistung Schlimmeres in Android 11 (z. B. zufällige Lese- oder Schreibvorgänge), empfehlen wir die Verwendung von MediaProvider-APIs, um Apps einen Nicht-FUSE-Zugriffsmodus zu geben, der die beste und konsistent leistungsfähigste Option darstellt.

MediaProvider- und FUSE-Updates

Das Verhalten der MediaProvider- Systemkomponenten unterscheidet sich zwischen Android-Versionen.

  • In Android 10 und niedriger war SDCardFS das Dateisystem und MediaProvider stellte eine Schnittstelle zu Dateisammlungen (z. B. Bilder, Videos, Musikdateien usw.) bereit. Wenn eine App mithilfe der Datei-API eine Datei erstellt, kann sie MediaProvider auffordern, die Datei zu scannen und in der Datenbank aufzuzeichnen.

  • In Android 11 oder höher ist SDCardFS veraltet und MediaProvider wird zum Dateisystem-Handler (für FUSE) für externen Speicher, wodurch das Dateisystem im externen Speicher und die MediaProvider-Datenbank konsistent werden. Als Userspace-Handler für das FUSE-Dateisystem kann MediaProvider Kernel-Aufrufe abfangen und sicherstellen, dass die Dateivorgänge datenschutzsicher 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. Dies bedeutet, dass in MediaProvider festgestellte Leistungs-, Datenschutz- oder Sicherheitsprobleme behoben und drahtlos über den Google Play Store oder andere von Partnern bereitgestellte Mechanismen bereitgestellt werden können. Alles im Rahmen dessen, was von einem FUSE-Handler erwartet wird, ist ebenfalls aktualisierbar, sodass Updates zur Behebung von FUSE-Leistungsrückgängen und Fehlern möglich sind.