Pamięć zewnętrzna jest zarządzana poprzez połączenie usługi vold
init i usługi systemowej StorageManagerService
. Montowaniem fizycznych woluminów pamięci zewnętrznej zajmuje się vold
, który wykonuje operacje przemieszczania w celu przygotowania nośnika przed udostępnieniem go aplikacjom.
Uwaga: w systemie Android 8.0 nazwa klasy MountService
została zmieniona na StorageManagerService
.
Mapowania plików
W systemie Android 4.2.2 i wcześniejszych wersjach plik konfiguracyjny vold.fstab
specyficzny dla urządzenia definiuje mapowania urządzeń sysfs na punkty podłączenia systemu plików, a każda linia ma następujący format:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
-
label
: Etykieta woluminu. -
mount_point
: Ścieżka systemu plików, w którym powinien zostać zamontowany wolumen. -
partition
: Numer partycji (w oparciu o 1) lub „auto” dla pierwszej użytecznej partycji. -
sysfs_path
: Jedna lub więcej ścieżek sysfs do urządzeń, które mogą zapewnić ten punkt podłączenia. Oddzielone spacjami, każdy musi zaczynać się od/
. -
flags
: opcjonalna lista flag oddzielonych przecinkami, nie może zawierać/
. Możliwe wartości obejmująnonremovable
iencryptable
.
W przypadku systemu Android w wersji 4.3 i nowszych różne pliki fstab używane przez init, vold i recovery zostały ujednolicone w pliku /fstab.<device>
. W przypadku woluminów pamięci zewnętrznej 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 montowana w /sys) do urządzenia, które może zapewnić punkt podłączenia. Ścieżka musi zaczynać się od/
. -
mount_point
: Ścieżka systemu plików, w którym powinien zostać zamontowany wolumen. -
type
: Typ systemu plików na woluminie. W przypadku kart zewnętrznych jest to zwyklevfat
. -
mnt_flags
:Vold
ignoruje to pole i powinno zostać ustawione nadefaults
-
fs_mgr_flags
:Vold
ignoruje wszystkie linie w ujednoliconym fstabie, które nie zawierają flagivoldmanaged=
w tym polu. Po tej fladze musi następować 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 pamięcią zewnętrzną na poziomie platformy i powyżej są obsługiwane przez StorageManagerService
. Ze względu na zmiany konfiguracyjne w systemie Android 6.0 (np. usunięcie nakładki zasobów Storage_list.xml) szczegóły konfiguracji zostały podzielone na dwie kategorie.
Android 5.x i starsze
Specyficzny dla urządzenia plik konfiguracyjny storage_list.xml
, zwykle dostarczany poprzez nakładkę frameworks/base
, definiuje atrybuty i ograniczenia urządzeń pamięci masowej. Element <StorageList>
zawiera jeden lub więcej elementów <storage>
, z których dokładnie jeden powinien być oznaczony jako podstawowy. Atrybuty <storage>
obejmują:
-
mountPoint
: ścieżka systemu plików tego wierzchowca. -
storageDescription
: zasób ciągu znaków opisujący to podłączenie. -
primary
: true, jeśli ten uchwyt jest podstawową pamięcią zewnętrzną. -
removable
: true, jeśli ten uchwyt ma nośniki wymienne, takie jak fizyczna karta SD. -
emulated
: true, jeśli ten montaż jest emulowany i jest wspierany przez pamięć wewnętrzną, prawdopodobnie przy użyciu demona FUSE. -
mtp-reserve
: liczba MB pamięci, którą MTP powinna zarezerwować na darmową pamięć. Używane tylko wtedy, gdy mocowanie jest oznaczone jako emulowane. -
allowMassStorage
: true, jeśli ten uchwyt może być współużytkowany przez pamięć masową USB. -
maxFileSize
: maksymalny rozmiar pliku w MB.
Urządzenia mogą zapewniać pamięć zewnętrzną poprzez emulację systemu plików niewrażliwego na wielkość liter i uprawnień, wspieranego 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
specyficzną dla urządzenia:
# 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 wewnętrzna pamięć zapasowa, a dest_path
to docelowy punkt podłączenia.
Podczas konfigurowania skryptu init.rc
specyficznego dla urządzenia należy zdefiniować zmienną środowiskową EXTERNAL_STORAGE
jako ścieżkę do podstawowej pamięci zewnętrznej. Ścieżka /sdcard
również musi prowadzić do tej samej lokalizacji, prawdopodobnie poprzez dowiązanie symboliczne. Jeśli urządzenie dostosowuje lokalizację pamięci zewnętrznej pomiędzy aktualizacjami platformy, należy utworzyć dowiązania symboliczne, aby stare ścieżki nadal działały.
Androida 6.0
Konfiguracja podsystemu pamięci masowej jest teraz skoncentrowana w pliku fstab
specyficznym dla urządzenia, a kilka historycznych statycznych plików/zmiennych konfiguracyjnych zostało usuniętych, aby zapewnić bardziej dynamiczne zachowanie:
- Nakładka zasobów
storage_list.xml
została usunięta i nie jest już używana przez platformę. Urządzenia pamięci masowej 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 montowania specyficznych dla użytkownika. Zamiast tego separacja użytkowników jest teraz wymuszana za pomocą identyfikatorów GID specyficznych dla użytkownika, a podstawowa pamięć współdzielona jest montowana na miejscu przezvold
w czasie wykonywania.- Programiści mogą nadal budować ścieżki dynamicznie lub statycznie, w zależności od przypadku użycia. Dołączenie identyfikatora UUID do ścieżki identyfikuje każdą kartę, dzięki czemu programiści mogą łatwiej określić lokalizację. (Na przykład
/storage/ABCD-1234/report.txt
jest wyraźnie innym plikiem niż/storage/DCBA-4321/report.txt
.)
- Programiści mogą nadal budować ścieżki dynamicznie lub statycznie, w zależności od przypadku użycia. Dołączenie identyfikatora UUID do ścieżki identyfikuje każdą kartę, dzięki czemu programiści mogą łatwiej określić lokalizację. (Na przykład
- Zakodowane na stałe usługi FUSE zostały usunięte z plików
init.rc
specyficznych dla urządzenia i zamiast tego w razie potrzeby są dynamicznie dzielone zvold
.
Oprócz tych zmian konfiguracyjnych w systemie Android 6.0 dostępna jest także koncepcja adaptowalnej pamięci masowej. W przypadku urządzeń z systemem Android 6.0 wszelkie niezastosowane nośniki fizyczne są postrzegane jako przenośne.
Możliwość dostosowania przechowywania
Aby wskazać możliwe urządzenie pamięci masowej 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
Po przyjęciu urządzenia magazynującego platforma usuwa jego zawartość i zapisuje tablicę partycji GUID, która definiuje dwie partycje:
- mała pusta partycja
android_meta
zarezerwowana do wykorzystania w przyszłości. Identyfikator GUID typu partycji to 19A710A2-B3CA-11E4-B026-10604B889DCF. - duża partycja
android_ext
, która jest zaszyfrowana przy użyciu dm-crypt i sformatowana przy użyciuext4
lubf2fs
, w zależności od możliwości jądra. Identyfikator GUID typu partycji to 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Przenośna pamięć masowa
W fstab
urządzenia pamięci masowej z atrybutem voldmanaged
są domyślnie uważane za przenośne, chyba że zdefiniowano inny atrybut, taki jak encryptable=userdata
. Oto przykładowa 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ą wybrać format nośnika, gdy system plików nie jest obsługiwany.