Pamięci zewnętrznej zarządza kombinacja usługi vold
init
i usługi StorageManagerService
system. Zarządzanie woluminami zewnętrznych nośników danych jest obsługiwane przez vold
, który wykonuje operacje wstępnego przygotowania nośnika przed udostępnieniem go aplikacjom.
Uwaga: w Androidzie 8.0 klasa MountService
została przemianowana na StorageManagerService
.
Mapowania plików
W przypadku Androida 4.2.2 i starszych plik konfiguracji vold.fstab
na urządzeniu określa mapowania urządzeń sysfs na punkty montowania w systemie plików. Każdy wiersz ma taki format:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label
: etykieta woluminu.mount_point
: ścieżka systemu plików, w którym należy zamontować wolumin.partition
: numer partycji (liczony od 1) lub „auto” w przypadku pierwszej dostępnej partycji.sysfs_path
: co najmniej 1 ścieżka sysfs do urządzeń, które mogą udostępniać ten punkt zamontowania. muszą być oddzielone spacjami i każdy z nich musi zaczynać się od/
.flags
: opcjonalna lista flag oddzielonych przecinkami, która nie może zawierać/
. Możliwe wartości tononremovable
iencryptable
.
W wersjach Androida 4.3 i nowszych różne pliki fstab używane przez init, vold i recovery zostały scalone w pliku /fstab.<device>
. W przypadku zewnętrznych woluminów pamięci masowej zarządzanych przez vold
wpisy powinny mieć następujący format:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src
: ścieżka w sysfs (zwykle zamontowana w katalogu /sys) do urządzenia, które może udostępnić punkt zamontowania. Ścieżka musi się zaczynać od/
.mount_point
: ścieżka systemu plików, w którym należy zamontować wolumin.type
: typ systemu plików na woluminie. W przypadku kart zewnętrznych jest to zwyklevfat
.mnt_flags
:Vold
ignoruje to pole i powinno być ustawione nadefaults
fs_mgr_flags
:Vold
ignoruje wszystkie wiersze w zjednoczonym pliku fstab, które nie zawierają w tym polu flagivoldmanaged=
. Po tym fragmencie musi nastąpić etykieta opisująca kartę oraz numer partycji lub słowoauto
. Oto przykład:voldmanaged=sdcard:auto
. Inne możliwe flagi tononremovable
,encryptable=sdcard
,noemulatedsd
iencryptable=userdata
.
Szczegóły konfiguracji
Interakcje z zewnętrznym urządzeniem do przechowywania danych na poziomie lub powyżej poziomu ram są obsługiwane przez StorageManagerService
. Z powodu zmian konfiguracji w Androidzie 6.0 (np. usunięcia zasobów z pliku storage_list.xml) szczegóły konfiguracji zostały podzielone na 2 kategorie.
Android 5.x i starsze
Plik konfiguracji storage_list.xml
, który dotyczy konkretnego urządzenia, jest zwykle udostępniany za pomocą nakładki frameworks/base
i określa atrybuty oraz ograniczenia urządzeń pamięci masowej. Element <StorageList>
zawiera co najmniej 1 element <storage>
, z których dokładnie 1 powinien być oznaczony jako element główny. Atrybuty <storage>
to:
mountPoint
: ścieżka do systemu plików tego zasobu.storageDescription
: zasób ciągu znaków opisujący ten punkt zaczepienia.primary
: wartość true, jeśli ten punkt dokowania jest podstawowym zewnętrznym miejscem na dane.removable
: wartość true, jeśli ten punkt zamontowania ma wymienny nośnik, np. kartę SD.emulated
: wartość prawda, jeśli ten punkt zamontowania jest emulowany i obsługiwany przez pamięć wewnętrzną, możliwie przy użyciu demona FUSE.mtp-reserve
: liczba MB wolnego miejsca na dane, które MTP powinno zarezerwować. Jest używany tylko wtedy, gdy punkt dokowania jest oznaczony jako emulowany.allowMassStorage
: wartość true (prawda), jeśli ten punkt zamontowania można udostępnić przez interfejs pamięci masowej USB.maxFileSize
: maksymalny rozmiar pliku w MB.
Urządzenia mogą udostępniać pamięć zewnętrzną, emulując system plików bez rozróżniania wielkości liter i bez uprawnień, który jest obsługiwany przez pamięć wewnętrzną. Jedną z możliwych implementacji jest demon FUSE w system/core/sdcard
, który można dodać jako usługę init.rc
na konkretnym urządzeniu:
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
Gdzie source_path
to kopia zapasowa pamięci wewnętrznej, a dest_path
to docelowy punkt podłączenia.
Podczas konfigurowania skryptu init.rc
dla konkretnego urządzenia zmienna środowiskowa EXTERNAL_STORAGE
musi być zdefiniowana jako ścieżka do podstawowego zewnętrznego miejsca na dane. Ścieżka /sdcard
musi też wskazywać tę samą lokalizację, prawdopodobnie za pomocą symbolicznego linku. Jeśli urządzenie zmienia lokalizację pamięci zewnętrznej między aktualizacjami platformy, należy utworzyć symboliczne linki, aby stare ścieżki nadal działały.
Android 6.0
Konfiguracja podsystemu pamięci jest teraz skoncentrowana w pliku fstab
specyficznym dla urządzenia, a kilka starszych statycznych plików konfiguracyjnych/zmiennych zostało usuniętych, aby umożliwić bardziej dynamiczne działanie:
- Nakładka zasobu
storage_list.xml
została usunięta i nie jest już używana przez framework. Urządzenia pamięci są teraz konfigurowane dynamicznie po wykryciu przezvold
. - Zmienne środowiskowe
EMULATED_STORAGE_SOURCE/TARGET
zostały usunięte i nie są już używane przez Zygote do konfigurowania punktów zamontowania dla poszczególnych użytkowników. Zamiast tego stosujemy teraz wymuszoną separację użytkowników za pomocą identyfikatorów GID na poziomie użytkownika. Główna pamięć współdzielona jest montowana przezvold
w czasie działania.- Deweloperzy mogą nadal tworzyć ścieżki dynamicznie lub statycznie w zależności od przypadku użycia. Uwzględnienie identyfikatora UUID na ścieżce pozwala zidentyfikować każdą kartę, aby ułatwić deweloperom jej zlokalizowanie. (na przykład
/storage/ABCD-1234/report.txt
to wyraźnie inny plik niż/storage/DCBA-4321/report.txt
).
- Deweloperzy mogą nadal tworzyć ścieżki dynamicznie lub statycznie w zależności od przypadku użycia. Uwzględnienie identyfikatora UUID na ścieżce pozwala zidentyfikować każdą kartę, aby ułatwić deweloperom jej zlokalizowanie. (na przykład
- W przypadku potrzebnym dynamicznym odgałęzieniami z poziomu
vold
są teraz używane zamiast zakodowanych na stałe usług FUSE.init.rc
Oprócz tych zmian konfiguracji Android 6.0 zawiera też pojęcie „adoptable storage”. W przypadku urządzeń z Androidem 6.0 wszystkie nośniki fizyczne, które nie są obsługiwane, są traktowane jako przenośne.
Pamięć dostosowywana
Aby wskazać urządzenie z adoptowanym miejscem na dane w fstab
, użyj atrybutu encryptable=userdata
w polu fs_mgr_flags
. Oto typowa definicja:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Gdy urządzenie pamięci zostanie zaadoptowane, platforma usuwa jego zawartość i zapisuje tabelę partycji GUID, która definiuje 2 partycje:
- mały pusty
android_meta
, który jest zarezerwowany do wykorzystania w przyszłości. Identyfikator GUID typu partycji to 19A710A2-B3CA-11E4-B026-10604B889DCF. - dużym partycji
android_ext
, która jest zaszyfrowana za pomocą dm-crypt i sformatowana za pomocąext4
lubf2fs
w zależności od możliwości jądra. Identyfikator GUID typu partycji to 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Pamięć przenośna
W fstab
urządzenia pamięci masowej z atrybutem voldmanaged
są domyślnie uważane za przenośne, chyba że zdefiniowany jest inny atrybut, na przykład encryptable=userdata
. Oto na przykład typowa definicja urządzeń USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
Platforma używa blkid
do wykrywania typów systemów plików przed zamontowaniem, a użytkownicy mogą sformatować nośnik, jeśli system plików nie jest obsługiwany.