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
iAndroid/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.