Pamięć o ograniczonym zakresie ogranicza dostęp aplikacji do pamięci zewnętrznej. W systemie Android 11 lub nowszym aplikacje przeznaczone dla interfejsu API 30 lub nowszego muszą korzystać z magazynu o ograniczonym zakresie. Wcześniej w systemie Android 10 aplikacje mogły zrezygnować z ograniczonego miejsca na dane.
Ograniczenia dostępu do aplikacji
Celem przechowywania o określonym zakresie jest ochrona prywatności aplikacji i danych użytkownika. Obejmuje to ochronę informacji o użytkowniku (takich jak metadane zdjęć), uniemożliwianie aplikacjom modyfikowania lub usuwania plików użytkownika bez wyraźnej zgody oraz ochronę poufnych dokumentów użytkownika pobranych do Pobrane lub innych folderów.
Aplikacje korzystające z magazynu o określonym zakresie 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 w plikach 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 Wszystkie pliki)
- Brak dostępu do odczytu i zapisu w zewnętrznych katalogach danych aplikacji innych aplikacji
Użyj magazynu o ograniczonym zakresie 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 blokowanie dostępu do plików w oparciu o zasady zezwalania , odmawiania lub redagowania dostępu. Aplikacje w magazynie o ograniczonym zakresie korzystające z FUSE uzyskują funkcje prywatności związane z magazynem o określonym zakresie i możliwość dostępu do plików przy użyciu bezpośredniej ścieżki pliku (dzięki czemu interfejsy API plików działają w aplikacjach).
Android 10 wymusza reguły przechowywania o ograniczonym zakresie w przypadku dostępu do plików przez MediaProvider, ale nie w przypadku bezpośredniego dostępu do ścieżki pliku (na przykład przy użyciu interfejsów API plików i interfejsów API NDK) ze względu na wysiłek wymagany do przechwytywania wywołań jądra. W rezultacie aplikacje w magazynie o ograniczonym zakresie nie mogły uzyskać dostępu do plików przy użyciu bezpośredniej ścieżki pliku. To ograniczenie wpłynęło na zdolność twórców aplikacji do adaptacji, ponieważ wymagało znacznych zmian w kodzie, aby przepisać dostęp File API do API MediaProvider.
FUSE i SDcardFS
Obsługa FUSE w systemie Android 11 nie jest powiązana z wycofywaniem SDCardFS , ale zapewnia alternatywę dla Media Store dla urządzeń, które wcześniej korzystały z SDCardFS. Urządzenia:
- Uruchamianie z systemem Android 11 lub nowszym przy użyciu jądra 5.4 lub nowszego nie umożliwia użycia SDCardFS.
- Aktualizacja do Androida 11 lub nowszego może umożliwić FUSE na SDCardFS w celu przechwytywania operacji na plikach i spełnienia celów związanych z prywatnością.
Strojenie wydajności FUSE
Android obsługiwał wcześniej FUSE w systemie Android 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 implementacji FUSE, w systemie Android 8 wprowadzono SDCardFS. W systemie Android 11 ponownie wprowadzono obsługę FUSE, korzystając z ulepszonej, lepiej przetestowanej implementacji libfuse
, którą można dostroić w celu rozwiązania problemów z wydajnością w systemie Android 7 lub starszym.
Strojenie FUSE obejmuje następujące poprawki:
- Pomijanie FUSE dla katalogów
Android/data
iAndroid/obb
w celu poprawy wydajności aplikacji do gier korzystających z tych katalogów. - Optymalizacje (takie jak dostrojenie współczynników odczytu z wyprzedzeniem i brudu w systemie plików FUSE), aby zapewnić wysoką wydajność odczytu i płynne odtwarzanie multimediów.
- Korzystanie z pamięci podręcznej zapisu zwrotnego FUSE.
- Uprawnienia do buforowania w celu ograniczenia liczby IPC do serwera systemowego.
- Optymalizacje aplikacji z dostępem do wszystkich plików w celu przyspieszenia operacji zbiorczych.
Powyższe poprawki dostrajające mogą zapewnić porównywalną wydajność pomiędzy urządzeniami FUSE i innymi urządzeniami. Na przykład testowanie dostrojonego Pixela 2 za pomocą FUSE i Pixela 2 za pomocą Media Store wykazało porównywalną wydajność odczytu sekwencyjnego (na przykład odtwarzania wideo) w przypadku dostępu do ścieżki pliku i Media Store. Jednak zapisy sekwencyjne były nieco gorsze w przypadku FUSE, a losowe odczyty i zapisy mogły być nawet dwukrotnie wolniejsze.
Pomiary wydajności mogą się zmieniać w zależności od urządzenia i konkretnych przypadków użycia. Ponieważ interfejsy API MediaProvider zapewniają najbardziej spójną wydajność, deweloperzy aplikacji, którym zależy na wydajności, powinni używać interfejsów API MediaProvider w swoich aplikacjach.
Ogranicz wpływ na wydajność FUSE
Wpływ na wydajność FUSE ogranicza się do intensywnych użytkowników plików przechowywanych wyłącznie w zewnętrznej pamięci współdzielonej . Zewnętrzna pamięć prywatna (która obejmuje katalogi android/data
i android/obb
) jest omijana przez FUSE, podczas gdy pamięć wewnętrzna (taka jak /data/data
, gdzie wiele aplikacji przechowuje dane, aby były zaszyfrowane i bezpieczne) nie jest montowana przez FUSE.
Aplikacje korzystające z niewielkiej ilości współdzielonej pamięci zewnętrznej często korzystają z ograniczonego zestawu plików (zwykle mniej niż 100 plików). Te aplikacje korzystają z istniejących optymalizacji typowych operacji odczytu i zapisu i nie powinny mieć żadnego wpływu na wydajność związaną z FUSE w systemie Android 11.
Aplikacje intensywnie korzystające ze współdzielonej pamięci zewnętrznej zazwyczaj wykonują zbiorcze operacje na plikach, takie jak wyświetlanie lub usuwanie katalogu zawierającego 1000 plików albo tworzenie lub usuwanie katalogu zawierającego milion plików w systemie plików. FUSE w systemie Android 11 może mieć wpływ na zbiorcze operacje na plikach, 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 na wydajność FUSE, aplikacje mogą przechowywać dane w zewnętrznej pamięci prywatnej lub używać masowych interfejsów API w klasie ContentProvider
w celu ominięcia FUSE i uzyskania ścieżki zoptymalizowanej pod kątem wydajności. Ponadto aktualizacja komponentu systemowego MediaProvider z października 2020 r. zawiera optymalizacje wydajności menedżerów plików i podobnych aplikacji (takich jak tworzenie kopii zapasowych/przywracanie danych, program antywirusowy), które posiadają uprawnienie MANAGE_EXTERNAL_STORAGE
.
Prywatność ponad wydajność
Na urządzeniach dostrojonych pod kątem FUSE najbardziej krytyczne podróże użytkowników są równie wydajne w przypadku systemów Android 10 i Android 11. Jednak podczas testowania testów porównawczych zestawu operacji na plikach system Android 11 może działać gorzej niż Android 10. W przypadku skutecznych wzorców dostępu do plików gorzej w systemie Android 11 (na przykład losowe odczyty lub zapisy), zalecamy używanie interfejsów API MediaProvider, aby zapewnić aplikacjom tryb dostępu inny niż FUSE, który jest najlepszą i stale wydajną opcją.
Aktualizacje MediaProvider i FUSE
Zachowanie komponentu systemowego MediaProvider różni się w zależności od wersji Androida.
W systemie Android 10 i starszych wersjach systemem plików był SDCardFS, a MediaProvider zapewniał interfejs do kolekcji plików (na przykład obrazów, filmów, plików muzycznych itp.). Gdy aplikacja utworzyła plik przy użyciu interfejsu File API, może poprosić MediaProvider o przeskanowanie pliku i zapisanie go w bazie danych.
W systemie Android 11 lub nowszym SDCardFS jest przestarzały, a MediaProvider staje się procedurą obsługi systemu plików (dla FUSE) dla pamięci zewnętrznej, dzięki czemu system plików w pamięci zewnętrznej i baza danych MediaProvider są spójne. Jako moduł obsługi przestrzeni użytkownika dla systemu plików FUSE, MediaProvider może przechwytywać wywołania jądra i zapewniać bezpieczeństwo operacji na plikach.
W systemie Android 11 i nowszych wersjach MediaProvider jest także modułowym składnikiem systemu (modułem Mainline), który można aktualizować poza wersjami systemu Android. Oznacza to, że problemy z wydajnością, prywatnością i bezpieczeństwem wykryte w MediaProvider można naprawić i dostarczyć bezprzewodowo ze Sklepu Google Play lub innych mechanizmów udostępnianych przez partnerów. Wszystko, czego oczekuje się od modułu obsługi FUSE, również można aktualizować, co umożliwia aktualizacje mające na celu naprawienie regresji wydajności i błędów FUSE.