Ograniczone miejsce na dane

Ograniczony dostęp do miejsca na dane ogranicza dostęp aplikacji do pamięci zewnętrznej. W Androidzie 11 lub nowszym aplikacje kierowane na interfejs API na poziomie 30 lub wyższym muszą używać ograniczonego miejsca na dane. W Androidzie 10 aplikacje mogły zrezygnować z ograniczonego miejsca na dane.

Ograniczenia dostępu aplikacji

Celem ograniczonego dostępu do pamięci jest ochrona prywatności danych aplikacji i użytkowników. Obejmuje to ochronę informacji o użytkownikach (np. metadanych zdjęć), zapobieganie modyfikowaniu lub usuwaniu plików użytkownika bez wyraźnej zgody oraz ochronę poufnych dokumentów użytkownika pobranych do folderu Pobrane lub innego folderu.

Aplikacje korzystające z ograniczonego miejsca na dane mogą mieć te poziomy dostępu (dostęp zależy od implementacji):

  • Uprawnienia do odczytu i zapisu własnych plików bez uprawnień
  • Czytaj – dostęp do plików multimedialnych innych aplikacji z uprawnieniem READ_EXTERNAL_STORAGE
  • Dostęp do zapisu w plikach multimedialnych innych aplikacji jest dozwolony tylko za zgodą użytkownika (z wyjątkiem aplikacji Galeria systemowa i aplikacji, które kwalifikują się do dostępu do wszystkich plików).
  • Nie ma uprawnień do odczytu ani zapisu w zewnętrznych katalogach danych innych aplikacji.

Korzystanie z ograniczonego miejsca na dane za pomocą FUSE

Android 11 lub nowszy obsługuje system plików w obszarze użytkownika (FUSE), który umożliwia modułowi MediaProvider badanie operacji na plikach w przestrzeni użytkownika i blokowanie dostępu do plików na podstawie zasad zezwalających, odrzucających lub uniemożliwiających dostęp. Aplikacje w ograniczonym miejscu do przechowywania, które korzystają z FUSE, zyskują funkcje prywatności ograniczonego miejsca do przechowywania oraz możliwość uzyskiwania dostępu do plików za pomocą bezpośredniej ścieżki do pliku (co pozwala zachować działanie interfejsów File API w aplikacjach).

W Androidzie 10 reguły przechowywania danych o zakresie ograniczonym do dostępu do plików zostały egzekwowane w przypadku dostępu do plików przez MediaProvider, ale nie w przypadku bezpośredniego dostępu do ścieżek plików (np. za pomocą interfejsu File API i interfejsów NDK API) ze względu na wysiłek związany z przechwytywaniem wywołań jądra. W rezultacie aplikacje w zasięgu pamięci nie mają dostępu do plików za pomocą bezpośredniej ścieżki do plików. To ograniczenie utrudniało deweloperom aplikacji dostosowywanie się, ponieważ wymagało to istotnych zmian w kodzie, które wymagały przepisywania dostępu interfejsu File API do interfejsu MediaProvider API.

FUSE i SDCardFS

Obsługa FUSE w Androidzie 11 nie jest powiązana z wycofaniem SDCardFS, ale stanowi alternatywę dla Media Store na urządzeniach, które wcześniej używały SDCardFS. Urządzenia:

  • Uruchomienie z Androidem 11 lub nowszym przy użyciu jądra 5.4 lub nowszego nie może korzystać z SDCardFS.
  • Po przejściu na Androida 11 lub nowszego możesz hostować FUSE na karcie SDCardFS, aby przechwytywać operacje plików i zapewniać ochronę prywatności.

Dostrajanie wydajności FUSE

Android obsługiwał wcześniej FUSE w wersji 7 lub starszej, w której zewnętrzna pamięć masowa była montowana jako FUSE. Z powodu problemów z wydajnością i zablokowaniami w ramach tej implementacji FUSE w Androidzie 8 wprowadzono SDCardFS. Android 11 ponownie obsługuje FUSE, wykorzystując ulepszoną, lepiej przetestowaną implementację libfuse, którą można dostosować, aby rozwiązać problemy z wydajnością w Androidzie 7 lub starszym.

Dostrajanie FUSE obejmuje te ulepszenia:

  • Omijanie FUSE w katalogach Android/data i Android/obb, aby poprawić wydajność aplikacji gier, które korzystają z tych katalogów.
  • Optymalizacje (takie jak dostrajanie współczynników odczytu z wyprzedzeniem i zabrudzenia systemu plików FUSE), by zapewnić wysoką jakość odczytu i płynne odtwarzanie multimediów.
  • Korzystanie z pamięci podręcznej zapisu zwrotnego FUSE.
  • Zapisywanie uprawnień w pamięci podręcznej w celu zmniejszenia liczby wywołań interfejsu IPC na serwerze systemowym.
  • Optymalizacje aplikacji z dostępem do wszystkich plików w celu przyspieszenia operacji zbiorczych.

Powyższe modyfikacje dostrajania mogą zapewnić porównywalną wydajność urządzeń FUSE i innych niż FUSE. Na przykład podczas testowania zoptymalizowanego Pixela 2 za pomocą FUSE i Pixela 2 za pomocą Media Store stwierdzono porównywalność wydajności odczytu sekwencyjnego (np. odtwarzanie wideo) między dostępem do ścieżki pliku a Media Store. Jednak sekwencyjne zapisy były nieco gorsze w przypadku FUSE, a losowe odczyty i zapisy mogły być nawet dwukrotnie wolniejsze.

Pomiary skuteczności mogą się różnić w zależności od urządzenia i konkretnych przypadków użycia. Interfejsy MediaProvider API zapewniają najbardziej spójną wydajność, dlatego deweloperzy, którym zależy na wydajności, powinni używać ich w swoich aplikacjach.

Ograniczanie wpływu FUSE na wydajność

Wpływ na wydajność FUSE jest ograniczony do użytkowników, którzy często korzystają z plików przechowywanych w pamięci zewnętrznej współdzielonej. FUSE omija zewnętrzną prywatną pamięć (w tym katalogi android/data i android/obb), podczas gdy pamięć wewnętrzna (np. /data/data, w której wiele aplikacji przechowuje dane, aby były szyfrowane i bezpieczne) nie jest ładowana przez FUSE.

  • Aplikacje, które rzadko korzystają z współdzielonej pamięci zewnętrznej, często wchodzą w interakcję z ograniczonym zestawem plików (zwykle mniej niż 100 plików). Te aplikacje korzystają z dotychczasowych optymalizacji typowych operacji odczytu i zapisu oraz nie powinny mieć wpływu na wydajność w Androidzie 11.

  • Aplikacje, które intensywnie korzystają z wspólnej pamięci zewnętrznej, zwykle wykonują operacje zbiorcze na plikach, takie jak wyświetlanie lub usuwanie katalogu z 1000 plikami albo tworzenie lub usuwanie katalogu z milionem plików w systemie plików. Operacje zbiorcze na plikach mogą być ograniczane przez FUSE w Androidzie 11, ale jeśli takie aplikacje kwalifikują się do uzyskania uprawnienia MANAGE_EXTERNAL_STORAGE, mogą korzystać z optymalizacji wydajności wprowadzonych w aktualizacji z października 2020 r.

Aby uniknąć obciążenia wydajności FUSE, aplikacje mogą przechowywać dane w zewnętrznej pamięci prywatnej lub używać interfejsów API zbiorczych w klasie ContentProvider, aby pominąć FUSE i uzyskać ścieżkę zoptymalizowaną pod kątem wydajności. Oprócz tego wprowadzona w październiku 2020 r. aktualizacja komponentu MediaProvider obejmuje optymalizacje wydajności menedżerów plików i podobnych aplikacji (np. do tworzenia i przywracania kopii zapasowych, aplikacji antywirusowych), które mają uprawnienia MANAGE_EXTERNAL_STORAGE.

Prywatność a wydajność

Na urządzeniach dostosowanych do FUSE większość najważniejszych ścieżek użytkownika działa równie dobrze na Androidzie 10 i Androidzie 11. Jednak w testach porównawczych dotyczących zestawu operacji na plikach Android 11 może działać gorzej niż Android 10. W przypadku wzorców dostępu do plików, które mają gorszą skuteczność w Androidzie 11 (na przykład przypadkowe odczyty lub zapisy), zalecamy korzystanie z interfejsów MediaProvider API, aby dać aplikacjom tryb dostępu bez FUSE, który jest najlepszą i spójną opcją.

Aktualizacje MediaProvider i FUSE

Zachowanie MediaProvider różni się w zależności od wersji Androida.

  • W Androidzie 10 i starszych systemem plików była karta SD, a MediaProvider udostępniał interfejs do kolekcji plików (np. obrazów, filmów, plików muzycznych itp.). Gdy aplikacja utworzyła plik za pomocą interfejsu File API, mogła poprosić MediaProvider o skanowanie pliku i zapisanie go w bazie danych.

  • W Androidzie 11 lub nowszym SDCardFS jest wycofany, a MediaProvider staje się modułem obsługi systemu plików (dla FUSE) dla pamięci zewnętrznej, co zapewnia spójność systemu plików na zewnętrznej pamięci masowej i bazy danych MediaProvider. MediaProvider, jako moduł obsługi przestrzeni użytkownika systemu plików FUSE, może przechwytywać wywołania jądra i zapewniać ochronę prywatności operacji na plikach.

W Androidzie 11 i nowszych MediaProvider jest też modułem systemowym (Mainline), który można aktualizować niezależnie od wersji Androida. Oznacza to, że problemy z wydajnością, prywatnością lub bezpieczeństwem znalezione w MediaProvider mogą zostać rozwiązane i przesłane bezprzewodowo ze Sklepu Google Play lub za pomocą innych mechanizmów udostępnianych przez partnera. Wszystko, co jest oczekiwane od przetwarzacza FUSE, można aktualizować, co umożliwia wprowadzanie poprawek w przypadku regresji wydajności FUSE i błędów.