Storage

Ikona HAL pamięci zewnętrznej na Androidzie

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, w tym z przenośnym i emulowanym miejscem 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 być 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 rozbudowanych uprawnień WRITE_EXTERNAL_STORAGE. Na przykład aplikacja z nazwą pakietu com.example.foo może teraz swobodnie korzystać z Android/data/com.example.foo/ na zewnętrznych urządzeniach pamięci masowej bez uprawnień. Te syntetyczne uprawnienia są uzyskiwane przez owijanie urządzeń do przechowywania w postaci surowych danych w demonie FUSE.

Począwszy od Androida 10 aplikacje kierowane na Androida 9 i starsze wersje domyślnie korzystają ze starszej pamięci masowej i mogą wyrazić zgodę na korzystanie z pamięci izolowanej. Aplikacje kierowane na Androida 10, które domyślnie korzystają z izolowanego miejsca na dane, mogą tymczasowo zrezygnować z tej funkcji. Aby zmienić stan domyślny, użyj atrybutu pliku manifestu requestLegacyExternalStorage, który kontroluje model pamięci masowej.

Ponieważ uprawnienia READ_EXTERNAL_STORAGEWRITE_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, nie zapewniając dostępu do karty SD. Dzieje się tak nawet wtedy, gdy aplikacja wymaga pamięci starszego typu. 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 kierowana na Androida 9 lub starszego i nie korzysta z oddzielnej pamięci masowej albo gdy aplikacja jest kierowana na Androida 10 i z niej zrezygnuje.

Stan białej listy można określić tylko podczas instalacji i nie można go zmienić, dopóki aplikacja nie zostanie zainstalowana.

Więcej informacji o ustawieniu uprawnienia READ_EXTERNAL_STORAGE znajdziesz w metodie 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 dostępnych szczegółowych uprawnień do multimediów wymienionych w sekcji Szczegółowe uprawnienia do multimediów zamiast o uprawnienia READ_EXTERNAL_STORAGE.

Android 14 opiera się na szczegółowych uprawnieniach do multimediów, aby umożliwić użytkownikom przyznawanie częściowego dostępu do biblioteki multimediów, gdy aplikacje proszą o uprawnienia do multimediów. 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.
  • Aplikacja /mnt/runtime/read jest wyświetlana w aplikacjach z atrybutem READ_EXTERNAL_STORAGE (ustawienie LEGACY_STORAGE na Androida 10)
  • Przycisk /mnt/runtime/write jest wyświetlany aplikacjom z atrybutem WRITE_EXTERNAL_STORAGE

W momencie odgałę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 zbinduje zamontowanie zaktualizowanego widoku. 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.