Tradycyjna pamięć masowa

Ikona interfejsu HAL pamięci zewnętrznej na Androidzie

Android obsługuje urządzenia z tradycyjną pamięcią masową, która jest zdefiniowana jako system plików nierozróżniający wielkości liter z niezmiennymi klasami uprawnień i trybami POSIX. Pojęcie tradycyjnego miejsca na dane obejmuje emulowane i przenośne miejsce na dane. Przenośna pamięć masowa to dowolna zewnętrzna pamięć masowa, która nie jest adoptowana przez system, a zatem nie jest sformatowana ani zaszyfrowana ani nie jest powiązana z konkretnym urządzeniem. Ponieważ tradycyjna zewnętrzna pamięć masowa zapewnia minimalną ochronę przechowywanych danych, kod systemu nie powinien przechowywać danych wrażliwych na zewnętrznej pamięci masowej. W szczególności pliki konfiguracji i pliki dziennika powinny być przechowywane tylko w pamięci wewnętrznej, gdzie można je skutecznie chronić.

Pamięć zewnętrzna dla wielu użytkowników

Od Androida 4.2 urządzenia mogą obsługiwać wielu użytkowników, a pamięć zewnętrzna musi spełniać te ograniczenia:

  • Każdy użytkownik musi mieć własną odseparowaną pamięć zewnętrzną i nie może mieć dostępu do zewnętrznej pamięci innych użytkowników.
  • Ścieżka /sdcard musi wskazywać prawidłową pamięć zewnętrzną główną powiązaną z użytkownikiem, w którego imieniu działa proces.
  • Miejsce na duże pliki OBB w katalogu Android/obb może być udostępniane wielu użytkownikom w ramach optymalizacji.
  • Aplikacje nie mogą zapisywać danych na dodatkowym zewnętrznym urządzeniu pamięci, z wyjątkiem katalogów dotyczących pakietu, w których jest to dozwolone przez zsyntetyzowane uprawnienia.

Domyślne wdrożenie tej funkcji na platformie wykorzystuje przestrzenie nazw jądra systemu Linux do tworzenia izolowanych tabel montowania dla każdego procesu utworzonego przez Zygote, a następnie używa bind mountów, aby udostępnić odpowiednią podstawową pamięć zewnętrzną dla danego użytkownika w tej prywatnej przestrzeni nazw.

Podczas uruchamiania system montuje jeden emulowany zewnętrzny system plików FUSE na EMULATED_STORAGE_SOURCE, który jest ukryty przed aplikacjami. Po utworzeniu przez Zygote fork bind mountuje odpowiedni podkatalog dla danego użytkownika z daemona FUSE do EMULATED_STORAGE_TARGET, aby ścieżki zewnętrznego magazynu były poprawnie rozpoznawane przez aplikację. Ponieważ aplikacja nie ma dostępnych punktów mountowania dla magazynu innych użytkowników, może uzyskać dostęp tylko do magazynu dla użytkownika, z którego została uruchomiona.

Ta implementacja korzysta też z funkcji wspólnego poddrzewa jądra, aby rozpowszechniać zdarzenia montażu z domyślnej przestrzeni nazw głównej do przestrzeni nazw aplikacji. Dzięki temu funkcje takie jak kontenery ASEC i montaż OBB będą nadal działać prawidłowo. Robi to, montując rootfs jako współdzielony, a następnie ponownie montując go jako podrzędny po utworzeniu każdej przestrzeni nazw Zygote.

Wiele urządzeń pamięci zewnętrznej

Od Androida 4.4 deweloperzy mają dostęp do wielu urządzeń zewnętrznych za pomocą Context.getExternalFilesDirs(), Context.getExternalCacheDirs()Context.getObbDirs().

Urządzenia pamięci zewnętrznej wyświetlane za pomocą tych interfejsów API muszą być częścią półtrwałą urządzenia (np. gniazdo karty SD w komorze baterii). Deweloperzy oczekują, że dane przechowywane w tych lokalizacjach będą dostępne przez długi czas. Z tego powodu urządzenia z pamięcią tymczasową (np. dyski zewnętrzne USB) nie powinny być wyświetlane za pomocą tych interfejsów API.

Uprawnienie WRITE_EXTERNAL_STORAGE musi zezwalać na zapisywanie tylko w przypadku głównego urządzenia do przechowywania danych na urządzeniu. Aplikacje nie mogą mieć uprawnień do zapisu na zewnętrznych urządzeniach pamięci podręcznej, z wyjątkiem katalogów pakietów, w których przypadku zezwala na to syntetyzowany zestaw uprawnień. Ograniczenie zapisu w taki sposób zapewnia, że system może usuwać pliki po odinstalowaniu aplikacji.

Obsługa multimediów USB

Android 6.0 obsługuje przenośne urządzenia pamięci, które są podłączone do urządzenia tylko przez krótki czas, np. pamięci flash USB. Gdy użytkownik podłączy nowe urządzenie przenośne, platforma wyświetli powiadomienie, które umożliwi mu skopiowanie zawartości tego urządzenia lub zarządzanie nią.

W Androidzie 6.0 każde urządzenie, które nie jest obsługiwane, jest uważane za przenośne. Ponieważ przenośne urządzenie do przechowywania danych jest podłączone tylko przez krótki czas, platforma nie wykonuje czasochłonnych operacji, takich jak skanowanie multimediów. Aplikacje innych firm muszą korzystać z platformy Storage Access Framework, aby wchodzić w interakcje z plikami w pamięci przenośnej. Ze względów związanych z prywatnością i bezpieczeństwem dostęp bezpośredni jest wyraźnie zablokowany.