Tradycyjna pamięć masowa

Ikona HAL pamięci zewnętrznej Android

Android obsługuje urządzenia z tradycyjną pamięcią masową, która jest zdefiniowana jako system plików bez rozróżniania 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 jest definiowana jako dowolna pamięć zewnętrzna, która nie jest przyjęta przez system, a zatem nie jest sformatowana i zaszyfrowana ani powiązana z określonym 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 dzienniki powinny być przechowywane tylko w pamięci wewnętrznej, gdzie mogą być skutecznie chronione.

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

Począwszy od 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ą wyizolowaną 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 być rozpoznawana jako poprawna podstawowa pamięć zewnętrzna specyficzna dla użytkownika na podstawie użytkownika, na którym działa proces.
  • Przechowywanie dużych plików OBB w katalogu Android/obb może być współużytkowane przez wielu użytkowników w ramach optymalizacji.
  • Dodatkowa pamięć zewnętrzna nie może być zapisywalna przez aplikacje, z wyjątkiem katalogów specyficznych dla pakietu, na które zezwalają uprawnienia syntetyczne.

Domyślna implementacja platformy tej funkcji wykorzystuje przestrzenie nazw jądra systemu Linux do tworzenia izolowanych tabel montowań dla każdego procesu rozwidlonego Zygote, a następnie używa montowań powiązań, aby zaoferować właściwą dla użytkownika podstawową zewnętrzną pamięć masową w tej prywatnej przestrzeni nazw.

Podczas rozruchu system montuje pojedynczego emulowanego demona FUSE zewnętrznej pamięci masowej w EMULATED_STORAGE_SOURCE , który jest ukryty przed aplikacjami. Po rozwidleniu Zygote powiązanie montuje odpowiedni podkatalog specyficzny dla użytkownika z poziomu demona FUSE do EMULATED_STORAGE_TARGET , aby ścieżki pamięci zewnętrznej zostały poprawnie rozwiązane dla aplikacji. Ponieważ aplikacja nie ma dostępnych punktów instalacji dla pamięci innych użytkowników, mogą oni uzyskać dostęp do pamięci tylko dla użytkownika, jako którego została uruchomiona.

Ta implementacja wykorzystuje również funkcję współdzielonego poddrzewa jądra do propagowania zdarzeń montowania z domyślnej głównej przestrzeni nazw do przestrzeni nazw aplikacji, co zapewnia, że ​​funkcje, takie jak kontenery ASEC i montowanie OBB, będą nadal działać poprawnie. Robi to, montując rootfs jako współdzielony, a następnie ponownie montując go jako niewolnika po utworzeniu każdej przestrzeni nazw Zygote.

Wiele zewnętrznych urządzeń pamięci masowej

Począwszy od systemu Android 4.4, wiele zewnętrznych urządzeń magazynujących jest udostępnianych deweloperom za pośrednictwem Context.getExternalFilesDirs() , Context.getExternalCacheDirs() i Context.getObbDirs() .

Zewnętrzne urządzenia pamięci masowej udostępniane za pośrednictwem tych interfejsów API muszą stanowić półtrwałą część urządzenia (np. gniazdo kart SD w komorze baterii). Deweloperzy oczekują, że dane przechowywane w tych lokalizacjach będą dostępne przez długi czas. Z tego powodu tymczasowe urządzenia pamięci masowej (takie jak dyski pamięci masowej USB) nie powinny być udostępniane za pośrednictwem tych interfejsów API.

Uprawnienie WRITE_EXTERNAL_STORAGE musi przyznawać dostęp do zapisu tylko do podstawowej pamięci zewnętrznej na urządzeniu. Nie wolno zezwalać aplikacjom na zapisywanie na dodatkowych zewnętrznych urządzeniach pamięci masowej, z wyjątkiem katalogów specyficznych dla danego pakietu, na które zezwalają uprawnienia syntetyczne. Ograniczenie zapisu w ten sposób zapewnia, że ​​system może wyczyścić pliki po odinstalowaniu aplikacji.

Obsługa nośników USB

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

W systemie Android 6.0 każde urządzenie, które nie jest zaadoptowane, jest uważane za przenośne. Ponieważ przenośna pamięć masowa jest podłączona tylko przez krótki czas, platforma pozwala uniknąć ciężkich operacji, takich jak skanowanie nośników. Aplikacje innych firm muszą przejść przez platformę dostępu do pamięci , aby wchodzić w interakcje z plikami w pamięci przenośnej; bezpośredni dostęp jest wyraźnie zablokowany ze względów prywatności i bezpieczeństwa.