Przechowywanie

Ikona HAL pamięci zewnętrznej Android

Android ewoluował z biegiem czasu, aby obsługiwać szeroką gamę typów i funkcji urządzeń pamięci masowej. Wszystkie wersje urządzeń z systemem Android obsługują tradycyjną pamięć masową , która obejmuje pamięć przenośną i emulowaną. Pamięć przenośną można zapewnić na nośnikach fizycznych, takich jak karta SD lub USB, do tymczasowego przesyłania danych/przechowywania plików. Nośniki fizyczne mogą pozostawać w urządzeniu przez dłuższy czas, ale nie są do niego przywiązane i można je 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 zapewniana 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śnik fizyczny, taki jak karta SD lub USB, która jest zaszyfrowana i sformatowana tak, aby zachowywała się jak pamięć wewnętrzna. Przyjęta 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 przez uprawnienie 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 szerokiego uprawnienia 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ą uzyskiwane przez owinięcie surowych urządzeń pamięci masowej w demona FUSE.

Począwszy od Androida 10, aplikacje przeznaczone dla systemu Android 9 i niższych domyślnie mają starsze miejsce i mogą korzystać z izolowanej pamięci masowej. Aplikacje kierowane na Androida 10 i domyślnie do 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 żąda starszej pamięci. 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 uprawnienia nieizolowanego. Uprawnienie kontroluje dostęp do karty SD oraz kolekcje dźwiękowe i wizualne. Dzieje się tak, gdy aplikacja jest przeznaczona dla systemu Android 9 lub starszego i nie korzysta z izolowanej pamięci masowej lub 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 uprawnienia READ_EXTERNAL_STORAGE , zobacz setWhitelistedRestrictedPermissions() w klasie PackageInstaller.SessionParams .

Uprawnienia wykonawcze

W systemie Android 6.0 wprowadzono nowy model uprawnień środowiska wykonawczego , 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 udzielać dostępu do pamięci bez zabijania lub ponownego uruchamiania już uruchomionych aplikacji. Robi 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 głównej przestrzeni nazw, w której 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 fork Zygote tworzymy przestrzeń nazw montowania dla każdej uruchomionej aplikacji i wiążemy montowanie odpowiedniego początkowego widoku na miejsce. Później, gdy zostaną przyznane uprawnienia czasu wykonywania, vold przeskakuje do przestrzeni nazw montowania już uruchomionych aplikacji i wiąże montowanie uaktualnionego widoku na miejsce. Pamiętaj, że obniżenie uprawnień zawsze powoduje zabicie aplikacji.

Funkcjonalność setns() użyta do zaimplementowania tej funkcji wymaga co najmniej Linuksa 3.8, ale poprawki zostały pomyślnie przeniesione do Linuksa 3.4. Test PermissionsHostTest CTS może służyć do weryfikacji prawidłowego zachowania jądra.