
Z czasem Android ewoluował, aby obsługiwać różne typy i funkcje urządzeń pamięci masowej. Wszystkie wersje Androida obsługują urządzenia z tradycyjnym miejscem na dane, które obejmuje przenośne i emulowane miejsce na dane. Pamięć przenośna może być dostarczana na nośnikach fizycznych, takich jak karta SD lub USB, które służą do tymczasowego przenoszenia danych lub przechowywania plików. Nośnik fizyczny może pozostać na urządzeniu przez dłuższy czas, ale nie jest z nim powiązany i może zostać usunięty. Karty SD są dostępne jako pamięć przenośna od wersji Androida 1.0. W Androidzie 6.0 dodano obsługę USB. Zemułowana pamięć masowa jest udostępniana przez udostępnienie części pamięci wewnętrznej przez warstwę emulacji i jest dostępna od wersji 3.0 Androida.
Od Androida 6.0 system obsługuje pamięć adoptowaną, która jest udostępniana przez nośniki fizyczne, takie jak karta SD lub USB, zaszyfrowane i sformatowane tak, aby działały jak pamięć wewnętrzna. W adoptowanym miejscu na dane można przechowywać wszystkie rodzaje danych aplikacji.
Uprawnienia
Dostęp do zewnętrznej pamięci masowej jest chroniony przez różne uprawnienia Androida.
Od wersji 1.0 Androida dostęp do zapisu jest chroniony uprawnieniem WRITE_EXTERNAL_STORAGE
. Od Androida 4.1 dostęp do odczytu jest chroniony uprawnieniem READ_EXTERNAL_STORAGE
.
Począwszy od Androida 4.4 właściciel, grupa i tryby plików na zewnętrznych urządzeniach pamięci są teraz syntetyzowane na podstawie struktury katalogu. Dzięki temu aplikacje mogą zarządzać katalogami dotyczącymi pakietów w pamięci zewnętrznej bez konieczności posiadania rozległych uprawnień WRITE_EXTERNAL_STORAGE
.
Na przykład aplikacja o nazwie pakietu com.example.foo
może teraz swobodnie uzyskiwać dostęp do Android/data/com.example.foo/
na urządzeniach z zewnętrznym nośnikiem danych bez żadnych uprawnień. Te syntetyczne uprawnienia są uzyskiwane przez owijanie urządzeń do przechowywania w postaci surowych danych w demonie FUSE.
Od Androida 10 aplikacje kierowane na Androida 9.0 lub starszego domyślnie korzystają ze starszego sposobu przechowywania danych i mogą wybrać izolowane miejsce na dane.
Aplikacje przeznaczone na Androida 10, które domyślnie korzystają z odizolowanego miejsca na dane, mogą tymczasowo zrezygnować z tego rozwiązania. Aby zmienić stan domyślny, użyj atrybutu pliku manifestu requestLegacyExternalStorage
, który kontroluje model przechowywania.
Ponieważ uprawnienia READ_EXTERNAL_STORAGE
i WRITE_EXTERNAL_STORAGE
są objęte miękkim ograniczeniem dostępu, jeśli instalator nie dodał aplikacji do białej listy, uprawnienia te kontrolują dostęp tylko do kolekcji dźwiękowych i wizualnych, bez dostępu do karty SD. Dotyczy to nawet sytuacji, gdy aplikacja prosi o przechowywanie w starym formacie. Więcej informacji o twardych i miękkich ograniczeniach znajdziesz w artykule
twarde i miękkie ograniczenia w Androidzie 10.
Jeśli instalator dodał uprawnienie do białej listy, aplikacja działająca w trybie starszego typu uzyskuje uprawnienia nieizolowane. To uprawnienie kontroluje dostęp do karty SD oraz do kolekcji dźwiękowych i wizualnych. Dzieje się tak, gdy aplikacja jest przeznaczona na Androida 9 lub niższego i nie korzysta z wyodrębnionej pamięci lub jest przeznaczona na Androida 10 i zrezygnowała z wyodrębnionej pamięci.
Stan białej listy można określić tylko w momencie instalacji. Nie można go zmienić, dopóki aplikacja nie zostanie zainstalowana.
Więcej informacji o ustawieniu uprawnienia READ_EXTERNAL_STORAGE
znajdziesz w metodzie
setWhitelistedRestrictedPermissions()
klasy
PackageInstaller.SessionParams.
Android 13 wprowadza szczegółowe uprawnienia multimedialne, aby umożliwić aplikacjom dostęp do plików multimedialnych utworzonych przez inne aplikacje. Aplikacje muszą prosić o co najmniej 1 z wyszczególnionych w sekcji
Szczegółowe uprawnienia dotyczące multimediów uprawnień do multimediów zamiast o uprawnienia READ_EXTERNAL_STORAGE
.
Android 14 wykorzystuje szczegółowe uprawnienia dostępu do multimediów, aby umożliwić użytkownikom przyznawanie częściowego dostępu do biblioteki multimediów, gdy aplikacje proszą o takie uprawnienia. Więcej informacji znajdziesz w artykule Udzielanie częściowego dostępu do zdjęć i filmów.
Uprawnienia czasu działania
Android 6.0 wprowadza nowy model
uprawnień w czasie wykonywania, w którym aplikacje proszą o możliwości w czasie wykonywania. Ponieważ nowy model obejmuje uprawnienia READ/WRITE_EXTERNAL_STORAGE
, platforma musi dynamicznie przyznawać dostęp do pamięci bez zamykania lub ponownego uruchamiania już uruchomionych aplikacji. Dokonuje tego, utrzymując 3 różne widoki wszystkich zamontowanych urządzeń pamięci masowej:
/mnt/runtime/default
jest wyświetlany aplikacjom bez specjalnych uprawnień do przechowywania oraz przestrzeni nazw głównej, w której znajdują sięadbd
i inne komponenty systemu./mnt/runtime/read
jest wyświetlany aplikacjom zREAD_EXTERNAL_STORAGE
(ustawLEGACY_STORAGE
w przypadku Androida 10)./mnt/runtime/write
jest wyświetlany aplikacjom zWRITE_EXTERNAL_STORAGE
W momencie rozgałęzienia Zygote tworzymy przestrzeń montażową dla każdej uruchomionej aplikacji i bindujemy odpowiedni widok początkowy. Później, gdy zostaną przyznane uprawnienia do czasu wykonywania, vold
przejdzie do przestrzeni nazw zamontowania już uruchomionych aplikacji i zabinduje zaktualizowany widok. Pamiętaj, że obniżenie uprawnień zawsze powoduje zatrzymanie aplikacji.
Funkcja setns()
używana do implementacji tej funkcji wymaga co najmniej systemu Linux 3.8, ale poprawki zostały przeniesione z powrotem do systemu Linux 3.4. Test CTS PermissionsHostTest
można wykorzystać do sprawdzenia prawidłowego działania jądra.