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ą. Przenośna pamięć masowa może być zapewniona na nośnikach fizycznych, takich jak karta SD lub USB, która służy do tymczasowego przesyłania danych/przechowywania plików. Nośnik fizyczny może pozostawać w urządzeniu przez dłuższy czas, ale nie jest do niego przywiązany i może zostać usunięty. 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ęć , która jest dostarczana 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 Androida. 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 systemu 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 kierowane na Androida 9 i niższe domyślnie do starszej pamięci masowej i mogą korzystać z izolowanej pamięci masowej. Aplikacje, które są przeznaczone na Androida 10 i domyślnie korzystają z izolowanej pamięci, 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 masowej. Aby uzyskać więcej informacji na temat ograniczeń twardych i 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 nieizolowanego uprawnienia. Uprawnienie kontroluje dostęp do karty SD oraz kolekcje dźwiękowe i wizualne. Dzieje się tak, gdy aplikacja jest przeznaczona na system Android 9 lub starszy i nie korzysta z izolowanej pamięci masowej lub jest przeznaczona na system Android 10 i z niej 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 masowej 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, po przyznaniu uprawnień środowiska uruchomieniowego, 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.