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 w wersji 30 lub nowszej muszą korzystać z ograniczonego dostępu do miejsca na dane. Wcześniej w Androidzie 10 aplikacje mogły zrezygnować z ograniczonego dostępu do miejsca na dane.
Ograniczenia dostępu aplikacji
Celem ograniczonego dostępu do miejsca na dane jest ochrona prywatności danych aplikacji i danych użytkownika. Obejmuje to ochronę informacji o użytkownikach (takich jak metadane zdjęć), uniemożliwianie aplikacjom modyfikowania lub usuwania plików użytkowników bez wyraźnego zezwolenia oraz ochronę poufnych dokumentów użytkowników pobranych do folderu Pobrane lub innych folderów.
Aplikacje korzystające z ograniczonego dostępu do miejsca na dane mogą mieć następujące poziomy dostępu (rzeczywisty dostęp zależy od implementacji).
- Dostęp do odczytu i zapisu własnych plików bez uprawnień.
- Dostęp do odczytu plików multimedialnych innych aplikacji z uprawnieniem
READ_EXTERNAL_STORAGE. - Dostęp do zapisu plików multimedialnych innych aplikacji jest dozwolony tylko za bezpośrednią zgodą użytkownika (wyjątki dotyczą Galerii systemowej i aplikacji, które kwalifikują się do dostępu do wszystkich plików).
- Brak dostępu do odczytu i zapisu w katalogach danych aplikacji zewnętrznych.
Korzystanie z ograniczonego dostępu do miejsca na dane z 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, odmawiania, lub redagowania dostępu. Aplikacje z ograniczonym dostępem do miejsca na dane, które korzystają z FUSE, mają funkcje ochrony prywatności ograniczonego dostępu do miejsca na dane oraz możliwość uzyskiwania dostępu do plików za pomocą bezpośredniej ścieżki do pliku (dzięki czemu interfejsy API plików działają w aplikacjach).
Android 10 wymuszał reguły ograniczonego dostępu do miejsca na dane w przypadku dostępu do plików przez MediaProvider, ale nie w przypadku bezpośredniego dostępu do ścieżki do pliku (np. za pomocą interfejsu File API i interfejsów NDK API) ze względu na wysiłek wymagany do przechwytywania wywołań jądra systemu operacyjnego. W rezultacie aplikacje z ograniczonym dostępem do pamięci nie mogły uzyskiwać dostępu do plików za pomocą bezpośredniej ścieżki do pliku. To ograniczenie utrudniało deweloperom dostosowywanie aplikacji, ponieważ wymagało znacznych zmian w kodzie, aby zastąpić dostęp do interfejsu File API dostępem do interfejsu MediaProvider API.
FUSE i SDCardFS
Obsługa FUSE w Androidzie 11 nie jest związana z wycofaniem SDCardFS, ale zapewnia alternatywę dla Media Store w przypadku urządzeń, które wcześniej korzystały z SDCardFS. Urządzenia:
- Urządzenia z Androidem 11 lub nowszym, które korzystają z jądra w wersji 5.4 lub nowszej, nie mogą używać SDCardFS.
- Urządzenia, które są aktualizowane do Androida 11 lub nowszego, mogą hostować FUSE na SDCardFS, aby przechwytywać operacje na plikach i spełniać cele związane z prywatnością.
Dostrajanie wydajności FUSE
Android wcześniej obsługiwał FUSE w Androidzie 7 lub starszym, w którym pamięć zewnętrzna była montowana jako FUSE. Ze względu na problemy z wydajnością i zakleszczeniem w tej implementacji FUSE w Androidzie 8 wprowadzono SDCardFS. Android 11 ponownie wprowadza obsługę FUSE za pomocą ulepszonej i lepiej przetestowanej implementacji libfuse, którą można dostroić, aby rozwiązać problemy z wydajnością w Androidzie 7 lub starszym.
Dostrajanie FUSE obejmuje te zmiany:
- Omijanie FUSE w przypadku katalogów
Android/dataiAndroid/obb, aby poprawić wydajność aplikacji do gier, które korzystają z tych katalogów. - Optymalizacje (takie jak dostrajanie współczynników wyprzedzania i zmodyfikowanych danych systemu plików FUSE), aby zapewnić wydajny odczyt i płynne odtwarzanie multimediów.
- Korzystanie z pamięci podręcznej zapisu zwrotnego FUSE.
- Buforowanie uprawnień w celu zmniejszenia liczby IPC do serwera systemowego.
- Optymalizacje dla aplikacji z dostępem do wszystkich plików, aby przyspieszyć operacje zbiorcze.
Powyższe zmiany mogą zapewnić porównywalną wydajność urządzeń z FUSE i bez FUSE. Na przykład testowanie dostrojonego Pixela 2 z FUSE i Pixela 2 z Media Store wykazało porównywalną wydajność odczytu sekwencyjnego (np. odtwarzania wideo) między dostępem do ścieżki do pliku a Media Store. Jednak zapisy sekwencyjne były nieco gorsze w przypadku FUSE, a odczyty i zapisy losowe mogły być nawet 2 razy wolniejsze.
Pomiary wydajności mogą się różnić w zależności od urządzenia i konkretnych przypadków użycia. Ponieważ interfejsy MediaProvider API zapewniają najbardziej spójną wydajność, deweloperzy aplikacji, którzy dbają o wydajność, powinni używać interfejsów MediaProvider API w swoich aplikacjach.
Ograniczanie wpływu FUSE na wydajność
Wpływ FUSE na wydajność jest ograniczony tylko do użytkowników, którzy intensywnie korzystają z plików przechowywanych w zewnętrznej pamięci współdzielonej. Zewnętrzna pamięć prywatna (która obejmuje katalogi android/data i android/obb) jest pomijana przez FUSE, a pamięć wewnętrzna (np. /data/data, w której wiele aplikacji przechowuje dane, aby je zaszyfrować i zabezpieczyć) nie jest montowana przez FUSE.
Aplikacje, które w niewielkim stopniu korzystają z udostępnionej pamięci zewnętrznej, często wchodzą w interakcję z ograniczoną liczbą plików (zwykle mniej niż 100 plików). Te aplikacje korzystają z istniejących optymalizacji typowych operacji odczytu i zapisu i nie powinny odczuwać żadnego wpływu FUSE na wydajność w Androidzie 11.
Aplikacje, które intensywnie korzystają z udostępnionej pamięci zewnętrznej, zwykle wykonują operacje zbiorcze na plikach, takie jak wyświetlanie lub usuwanie katalogu z 1000 plików albo tworzenie lub usuwanie katalogu z milionem plików w systemie plików. Na operacje zbiorcze na plikach może mieć wpływ FUSE w Androidzie 11, ale jeśli takie aplikacje kwalifikują się do uprawnienia
MANAGE_EXTERNAL_STORAGE, korzystają z optymalizacji wydajności zawartych w aktualizacji z października 2020 r.
Aby uniknąć narzutu wydajności FUSE, aplikacje mogą przechowywać dane w zewnętrznej pamięci prywatnej lub używać zbiorczych interfejsów API w klasie ContentProvider, aby ominąć FUSE i uzyskać ścieżkę zoptymalizowaną pod kątem wydajności. Ponadto aktualizacja komponentu systemowego MediaProvider z października 2020 r. zawiera optymalizacje wydajności dla menedżerów plików i podobnych aplikacji (takich jak tworzenie kopii zapasowych i przywracanie danych, antywirus), które mają uprawnienie MANAGE_EXTERNAL_STORAGE.
Prywatność ważniejsza niż wydajność
Na urządzeniach dostrojonych pod kątem FUSE większość najważniejszych ścieżek użytkownika działa równie dobrze w Androidzie 10 i Androidzie 11. Jednak podczas testowania benchmarków na zestawie 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żywanie interfejsów MediaProvider API, aby zapewnić aplikacjom tryb dostępu bez FUSE, który jest najlepszą i najbardziej wydajną opcją.
Aktualizacje MediaProvider i FUSE
Działanie komponentu systemowego MediaProvider różni się w zależności od wersji Androida.
W Androidzie 10 i starszych wersjach SDCardFS był systemem plików, a MediaProvider udostępniał interfejs do kolekcji plików (np. obrazów, filmów, plików muzycznych itp.). Gdy aplikacja tworzyła plik za pomocą interfejsu File API, mogła poprosić MediaProvider o przeskanowanie pliku i zapisanie go w bazie danych.
W Androidzie 11 lub nowszym, SDCardFS jest wycofywany, a MediaProvider staje się obsługą systemu plików (dla FUSE) w przypadku pamięci zewnętrznej, dzięki czemu system plików w pamięci zewnętrznej i baza danych MediaProvider są spójne. Jako obsługa przestrzeni użytkownika dla systemu plików FUSE MediaProvider może przechwytywać wywołania jądra i zapewniać, że operacje na plikach są bezpieczne pod względem prywatności.
W Androidzie 11 i nowszym MediaProvider jest też a modułowym komponentem systemowym (a modułem Mainline), który można aktualizować poza wersjami Androida. Oznacza to, że problemy z wydajnością, prywatnością lub bezpieczeństwem wykryte w MediaProvider można rozwiązać i dostarczyć bezprzewodowo ze Sklepu Google Play lub za pomocą innych mechanizmów dostarczanych przez partnerów. Wszystko, co mieści się w zakresie oczekiwań od obsługi FUSE, można też aktualizować, co umożliwia aktualizacje, które rozwiązują problemy z wydajnością i błędy FUSE.