Android obsługuje urządzenia z tradycyjną pamięcią masową, która jest systemem plików nieuwzględniającym wielkości liter, z niezmiennymi klasami i trybami uprawnień POSIX. Pojęcie tradycyjnej pamięci masowej obejmuje pamięć emulowaną i przenośną. Pamięć przenośna to dowolna pamięć zewnętrzna, która nie jest akceptowana przez system i dlatego nie jest sformatowana, zaszyfrowana ani powiązana z konkretnym urządzeniem. Ponieważ tradycyjna pamięć zewnętrzna zapewnia minimalną ochronę przechowywanych danych, kod systemowy nie powinien przechowywać poufnych danych w pamięci zewnętrznej. W szczególności pliki konfiguracyjne i pliki dziennika powinny być przechowywane wyłącznie w pamięci wewnętrznej, gdzie można je skutecznie chronić.
Zewnętrzna pamięć masowa dla wielu użytkowników
Począwszy od wersji Androida 4.2, urządzenia mogą obsługiwać wielu użytkowników, a pamięć zewnętrzna musi spełniać następujące ograniczenia:
- Każdy użytkownik musi mieć własną, izolowaną podstawową pamięć zewnętrzną i nie może mieć dostępu do podstawowej pamięci zewnętrznej innych użytkowników.
- Ścieżka
/sdcard
musi wskazywać właściwą podstawową pamięć zewnętrzną specyficzną dla użytkownika, w zależności od użytkownika, jako którego działa proces. - W ramach optymalizacji miejsce na duże pliki OBB w katalogu
Android/obb
może być współużytkowane przez wielu użytkowników. - Dodatkowa pamięć zewnętrzna nie może być zapisywana przez aplikacje, z wyjątkiem katalogów specyficznych dla pakietu, na które pozwalają syntetyzowane uprawnienia.
Domyślna implementacja tej funkcji na platformie wykorzystuje przestrzenie nazw jądra Linuksa do tworzenia izolowanych tabel montowania dla każdego procesu rozwidlonego przez Zygotę, a następnie używa montowania powiązań, aby zapewnić właściwą, specyficzną dla użytkownika podstawową pamięć zewnętrzną w tej prywatnej przestrzeni nazw.
Podczas rozruchu system montuje pojedynczego emulowanego demona FUSE pamięci zewnętrznej w EMULATED_STORAGE_SOURCE
, który jest ukryty przed aplikacjami. Po rozwidleniu Zygoty montuje odpowiedni podkatalog specyficzny dla użytkownika spod demona FUSE do EMULATED_STORAGE_TARGET
, dzięki czemu ścieżki pamięci zewnętrznej są poprawnie rozpoznawane dla aplikacji. Ponieważ aplikacji brakuje dostępnych punktów podłączenia pamięci innych użytkowników, może ona uzyskać dostęp tylko do pamięci użytkownika, jako który została uruchomiona.
Ta implementacja wykorzystuje również funkcję jądra współdzielonego poddrzewa do propagowania zdarzeń montowania z domyślnej głównej przestrzeni nazw do przestrzeni nazw aplikacji, co gwarantuje, że funkcje takie jak kontenery ASEC i montowanie OBB będą nadal działać poprawnie. Robi to poprzez zamontowanie rootfs jako współdzielonego, a następnie ponowne zamontowanie go jako slave po utworzeniu każdej przestrzeni nazw Zygote.
Wiele zewnętrznych urządzeń pamięci masowej
Począwszy od Androida 4.4, programiści mogą korzystać z wielu zewnętrznych urządzeń pamięci masowej za pośrednictwem Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
i Context.getObbDirs()
.
Uprawnienie WRITE_EXTERNAL_STORAGE
może przyznawać dostęp wyłącznie do zapisu w podstawowej pamięci zewnętrznej na urządzeniu. Nie wolno zezwalać aplikacjom na zapis na dodatkowych zewnętrznych urządzeniach pamięci masowej, z wyjątkiem katalogów specyficznych dla pakietu, na które pozwalają syntetyzowane uprawnienia. Ograniczenie zapisu w ten sposób gwarantuje, że system będzie mógł wyczyścić pliki po odinstalowaniu aplikacji.
Obsługa multimediów USB
Android 6.0 obsługuje przenośne urządzenia pamięci masowej, które są podłączone do urządzenia tylko na krótki okres czasu, np. dyski flash USB. Gdy użytkownik wstawi nowe urządzenie przenośne, platforma wyświetli powiadomienie umożliwiające kopiowanie zawartości tego urządzenia lub zarządzanie nią.
W systemie Android 6.0 każde niezastosowane urządzenie jest uważane za przenośne. Ponieważ przenośna pamięć masowa jest podłączona tylko na krótki czas, platforma pozwala uniknąć ciężkich operacji, takich jak skanowanie multimediów. Aplikacje innych firm muszą przejść przez platformę dostępu do pamięci masowej, aby móc wchodzić w interakcję z plikami w pamięci przenośnej; bezpośredni dostęp jest wyraźnie zablokowany ze względów prywatności i bezpieczeństwa.