Miejsce na dane ograniczone

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 (rzeczywisty dostęp zależy od implementacji):

  • Odczyt i zapis 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).
  • Brak dostępu do odczytu ani zapisu w katalogach danych zewnętrznych innych aplikacji.

Korzystanie z ograniczonego miejsca na dane za pomocą FUSE

Android 11 lub nowszy obsługuje system plików w przestrzeni użytkownika (FUSE), który umożliwia modułowi MediaProvider sprawdzanie operacji na plikach w przestrzeni użytkownika i ograniczanie dostępu do plików na podstawie zasad zezwalania, odmowy lub edytowania dostępu. Aplikacje w ograniczonym miejscu do przechowywania, które korzystają z FUSE, zyskują funkcje prywatności ograniczonego miejsca do przechowywania oraz możliwość 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 wymuszono ograniczone zasady przechowywania danych w przypadku dostępu do plików przez MediaProvider, ale nie w przypadku bezpośredniego dostępu do ścieżki pliku (np. za pomocą interfejsu File API i interfejsów NDK), ponieważ wymagałoby to dużego nakładu pracy związanego z przechwytywaniem wywołań jądra. W efekcie aplikacje w ograniczonym miejscu na dane nie mogły uzyskać dostępu do plików za pomocą bezpośredniej ścieżki do pliku. To ograniczenie wpłynęło na zdolność deweloperów aplikacji do dostosowania się do zmian, ponieważ wymagało wprowadzenia znacznych zmian w kodzie, aby przerobić dostęp do interfejsu File API na dostęp 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 korzystały z SDCardFS. Urządzenia:

  • Uruchomienie z Androidem 11 lub nowszym przy użyciu jądra 5.4 lub nowszego nie może korzystać z SDCardFS.
  • Uaktualnienie do Androida 11 lub nowszego może hostować FUSE na SDCardFS, aby przechwytywać operacje na plikach i spełniać wymagania dotyczące prywatności.

Dostrajanie wydajności FUSE

Android obsługiwał wcześniej FUSE w Androidzie 7 lub starszym, w którym 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, korzystając z ulepszonej, lepiej przetestowanej implementacji libfuse, którą można dostosować, aby rozwiązać problemy z wydajnością w Androidzie 7 lub starszym.

Dostosowanie FUSE obejmuje te zmiany:

  • Ominięcie FUSE w przypadku katalogów Android/dataAndroid/obb w celu poprawy wydajności aplikacji z grami, które korzystają z tych katalogów.
  • Optymalizacje (np. dostosowanie współczynników odczytu w przód i nieczystości systemu plików FUSE) w celu zapewnienia wydajnego odczytu i płynnego odtwarzania multimediów.
  • Korzystanie z pamięci podręcznej z zapisem wstecznym FUSE.
  • Zapisywanie w pamięci podręcznej uprawnień w celu zmniejszenia liczby wywołań interfejsu IPC do serwera systemowego.
  • Optymalizacja aplikacji z dostępem do wszystkich plików w celu przyspieszenia operacji zbiorczych.

Powyższe ustawienia mogą zapewnić porównywalność wydajności urządzeń z FUSE i bez 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.

Wyniki pomiarów wydajności mogą się różnić w zależności od urządzenia i konkretnych przypadków użycia. Interfejsy MediaProvider API zapewniają najbardziej stabilną 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 FUSE na wydajność jest ograniczony tylko do użytkowników, którzy często korzystają z plików przechowywanych na zewnętrznym wspólnym dysku. 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 udostępnionego miejsca na dysku zewnętrznym, często działają z ograniczonym zestawem plików (zazwyczaj 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ściowego FUSE, aplikacje mogą przechowywać dane w zewnętrznej pamięci prywatnej lub używać interfejsów API zbiorczego w klasie ContentProvider, aby pominąć FUSE i uzyskać ścieżkę zoptymalizowaną pod kątem wydajności. Dodatkowo październikowa aktualizacja komponentu systemu MediaProvider zawiera optymalizacje wydajności dla menedżerów plików i podobnych aplikacji (takich jak kopie zapasowe/przywracanie czy antywirusy), które mają uprawnienia MANAGE_EXTERNAL_STORAGE.

Prywatność a wydajność

Na urządzeniach, które zostały dostosowane do FUSE, większość najważniejszych ścieżek użytkownika działa równie dobrze na Androidzie 10 i Androidzie 11. Jednak podczas testowania porównań w ramach 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 działają gorzej w Androidzie 11 (np. odczyty lub zapisy losowe), zalecamy użycie interfejsów MediaProvider API, aby zapewnić aplikacjom tryb dostępu bez FUSE, który jest najlepszą i najbardziej wydajną 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. Jako moduł obsługi przestrzeni użytkownika w systemie plików FUSE MediaProvider może przechwytywać wywołania jądra i zapewniać ochronę prywatności podczas 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ć naprawione i przesłane bezprzewodowo z Google Play Store lub za pomocą innych mechanizmów udostępnianych przez partnera. Wszystko, co jest oczekiwane od obsługi FUSE, można również aktualizować, co umożliwia wprowadzanie poprawek w celu naprawienia regresji i błędów związanych z wydajnością FUSE.