Miejsce na dane

Ikona HAL zewnętrznej pamięci masowej Androida

Android ewoluował z biegiem czasu, aby obsługiwać szeroką gamę typów i funkcji urządzeń pamięci masowej. Wszystkie wersje Androida obsługują urządzenia z tradycyjną pamięcią masową , w tym pamięcią przenośną i emulowaną. Przenośna pamięć masowa może być zapewniona przez nośniki fizyczne, takie jak karta SD lub USB, które służą do tymczasowego przesyłania danych/przechowywania plików. Nośnik fizyczny może pozostać w urządzeniu przez dłuższy czas, ale nie jest z nim powiązany i można go usunąć. Karty SD są dostępne jako przenośna pamięć masowa od Androida 1.0; Android 6.0 dodał obsługę USB. Emulowana pamięć masowa jest udostępniana przez udostępnienie części pamięci wewnętrznej przez warstwę emulacji i jest dostępna od Androida 3.0.

Począwszy od Androida 6.0, Android obsługuje adaptowalną pamięć masową , która jest zapewniana przez nośniki fizyczne, takie jak karta SD lub USB, które są szyfrowane i formatowane tak, aby zachowywały się jak pamięć wewnętrzna. Adoptowalna pamięć masowa może przechowywać wszystkie typy danych aplikacji.

Uprawnienia

Dostęp do pamięci zewnętrznej jest chroniony różnymi uprawnieniami systemu Android. Począwszy od Androida 1.0 dostęp do zapisu jest chroniony uprawnieniem WRITE_EXTERNAL_STORAGE . Począwszy 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 masowej są teraz syntetyzowane na podstawie struktury katalogów. Dzięki temu aplikacje mogą zarządzać katalogami specyficznymi dla pakietów w pamięci zewnętrznej bez konieczności posiadania szerokich 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 zewnętrznych urządzeniach pamięci masowej bez uprawnień. Te zsyntetyzowane uprawnienia są osiągane przez opakowywanie surowych urządzeń pamięci masowej w demona FUSE.

Począwszy od Androida 10, aplikacje przeznaczone na Androida 9 i starsze domyślnie korzystają ze starszej wersji pamięci masowej i mogą zdecydować się na izolowaną pamięć masową. Aplikacje, które są przeznaczone na system Android 10 i domyślnie korzystają z izolowanej pamięci masowej, mogą tymczasowo z niej zrezygnować . Użyj atrybutu manifestu requestLegacyExternalStorage , który kontroluje model magazynu, aby zmienić stan domyślny.

Ponieważ zarówno uprawnienia READ_EXTERNAL_STORAGE , jak i WRITE_EXTERNAL_STORAGE są ograniczone programowo, jeśli instalator nie umieścił aplikacji na białej liście, uprawnienie kontroluje dostęp tylko do kolekcji dźwiękowych i wizualnych, bez dostępu do karty SD. Ma to zastosowanie nawet wtedy, gdy aplikacja zażąda starszego miejsca na dane. Aby uzyskać więcej informacji o ograniczeniach twardych i ograniczeniach miękkich, zobacz Ograniczenia twarde i miękkie w systemie Android 10 .

Jeśli instalator umieścił uprawnienie na białej liście, aplikacja działająca w starszym trybie uzyskuje zachowanie uprawnień nieizolowanych. Uprawnienie kontroluje dostęp do karty SD oraz zbiory dźwiękowe i wizualne. Dzieje się tak, gdy aplikacja jest przeznaczona dla systemu Android 9 lub starszego i nie zgadza się na izolowaną pamięć masową albo jest przeznaczona dla systemu Android 10 i rezygnuje.

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

Aby uzyskać więcej informacji na temat ustawiania uprawnień READ_EXTERNAL_STORAGE , patrz setWhitelistedRestrictedPermissions() w klasie PackageInstaller.SessionParams .

Android 13 wprowadza szczegółowe uprawnienia do multimediów w celu obsługi aplikacji uzyskujących dostęp do plików multimedialnych utworzonych przez inne aplikacje. Aplikacje muszą zażądać co najmniej jednego szczegółowego uprawnienia do multimediów wymienionego w Szczegółowych uprawnieniach do multimediów zamiast uprawnienia READ_EXTERNAL_STORAGE .

Uprawnienia wykonawcze

Android 6.0 wprowadza nowy model uprawnień w czasie wykonywania , w którym aplikacje żądają możliwości, gdy są potrzebne w czasie wykonywania. Ponieważ nowy model obejmuje uprawnienia READ/WRITE_EXTERNAL_STORAGE , platforma musi dynamicznie przyznawać dostęp do pamięci masowej bez zabijania lub ponownego uruchamiania już uruchomionych aplikacji. Czyni to, zachowując trzy różne widoki wszystkich zamontowanych urządzeń pamięci masowej:

  • /mnt/runtime/default jest pokazywany aplikacjom bez specjalnych uprawnień do przechowywania oraz w głównej przestrzeni nazw, w której znajduje się adbd i inne składniki systemu.
  • /mnt/runtime/read jest pokazywany aplikacjom z READ_EXTERNAL_STORAGE (Ustaw LEGACY_STORAGE dla Androida 10)
  • /mnt/runtime/write jest pokazywany aplikacjom z WRITE_EXTERNAL_STORAGE

W czasie rozwidlenia Zygote tworzymy przestrzeń nazw montowania dla każdej działającej aplikacji i wiążemy montowanie z odpowiednim początkowym widokiem. Później, gdy zostaną przyznane uprawnienia wykonawcze, vold wskakuje do przestrzeni nazw montowania już uruchomionych aplikacji i bind montuje uaktualniony widok na miejscu. Pamiętaj, że obniżenie uprawnień zawsze powoduje zabicie aplikacji.

Funkcjonalność setns() używana do implementacji tej funkcji wymaga co najmniej Linuksa 3.8, ale łatki zostały pomyślnie przeniesione do Linuksa 3.4. Test CTS PermissionsHostTest może być użyty do sprawdzenia prawidłowego zachowania jądra.