Pamięcią zewnętrzną zarządza się za pomocą kombinacji inicjowania vold
i usługi systemowej StorageManagerService
. Montaż
fizyczne woluminy pamięci zewnętrznej są obsługiwane przez usługę vold
, która
wykonuje operacje przejściowe, aby przygotować multimedia przed udostępnieniem ich w aplikacjach.
Uwaga: w Androidzie 8.0
Nazwa zajęć MountService
została zmieniona na
StorageManagerService
Mapowania plików
W przypadku Androida 4.2.2 i starszych wersji vold.fstab
na określone urządzenie
plik konfiguracji definiuje mapowania z urządzeń sysfs na punkt montowania w systemie plików
punktów, a każdy wiersz 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órej należy podłączyć wolumin.partition
: numer partycji (w oparciu o wartość 1) lub „auto” (automatyczna). dla pierwszej partycji użytej do użycia.sysfs_path
: co najmniej 1 ścieżka sysfs do urządzeń, które mogą zapewnić ten uchwyt . Rozdzielone spacjami, a każdy z nich musi zaczynać się od/
.flags
: opcjonalna lista flag rozdzielonych przecinkami – nie może zawierać/
. Możliwe wartości tononremovable
iencryptable
.
W przypadku Androida w wersji 4.3 i nowszych różne pliki fstab używane przez narzędzia init, vold i
przywracanie zostało ujednolicone w pliku /fstab.<device>
. Do użytku zewnętrznego
woluminy pamięci masowej zarządzane przez vold
, wpisy powinny mieć
w tym formacie:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src
: ścieżka w systemie sysfs (zwykle podłączana w miejscu /sys) do urządzenia, które może dostarczyć punkt podłączania. Ścieżka musi zaczynać się od/
.mount_point
: ścieżka systemu plików, w której należy podłączyć wolumin.type
: typ systemu plików w woluminie. W przypadku kart zewnętrznych zwykle jest tovfat
.mnt_flags
: poleVold
ignoruje to pole i należy je ustawić do:defaults
fs_mgr_flags
:Vold
ignoruje wszystkie wiersze w ujednoliconym panelu fstab które nie zawierają flagivoldmanaged=
w tym polu. Ta flaga musi znajduje się po nim 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 na poziomie platformy są obsługiwane
do StorageManagerService
. W związku ze zmianami w konfiguracji w
w Androidzie 6.0 (np. usunięcie nakładki zasobów storage_list.xml)
szczegóły konfiguracji
są podzielone na 2 kategorie.
Android 5.x i starsze
Konfiguracja storage_list.xml
na danym urządzeniu
, zazwyczaj udostępniany w postaci nakładki frameworks/base
, definiuje
atrybutów i ograniczeń urządzeń pamięci masowej. Element <StorageList>
zawiera co najmniej jeden element <storage>
, z których dokładnie 1 z nich powinien być oznaczony
jako główną. Dostępne atrybuty <storage>
:
mountPoint
: ścieżka systemu plików tego podłączenia.storageDescription
: zasób ciągu tekstowego opisujący ten punkt montowania.primary
: true, jeśli ten punkt podłączenia jest podstawową pamięcią zewnętrzną.removable
: true, jeśli ten uchwyt ma wymienny nośnik, taki jak fizyczny SD.emulated
: true, jeśli ten punkt montowania jest emulowany i korzysta z pamięci wewnętrznej, prawdopodobnie używając demona FUSE.mtp-reserve
: liczba MB miejsca, które MTP powinno zarezerwować bezpłatnie. pamięci masowej. Używany tylko wtedy, gdy punkt montowania jest oznaczony jako emulowany.allowMassStorage
: true, jeśli ten punkt montowania może być udostępniany przez pamięć masową USB.maxFileSize
: maksymalny rozmiar pliku w MB.
Urządzenia mogą zapewnić pamięć zewnętrzną przez emulację interfejsu bez rozróżniania wielkości liter,
bez uprawnień w systemie plików
w pamięci wewnętrznej. 1 możliwy
jest implementowana przez demona FUSE w system/core/sdcard
, który może
zostać dodany jako usługa init.rc
dla konkretnego 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 pamięć wewnętrzna, a dest_path
to pamięć wewnętrzna
docelowego punktu podłączania.
Podczas konfigurowania skryptu init.rc
na potrzeby konkretnego urządzenia EXTERNAL_STORAGE
zmienna środowiskowa musi być zdefiniowana jako ścieżka do podstawowego elementu zewnętrznego
pamięci masowej. Ścieżka /sdcard
musi też prowadzić do tej samej lokalizacji, być może
przy użyciu dowiązania symbolicznego. Jeśli urządzenie zmienia lokalizację pamięci zewnętrznej między
aktualizacji platformy, należy utworzyć dowiązania symboliczne, aby stare ścieżki działały.
Android 6.0
Konfiguracja podsystemu pamięci masowej jest obecnie skoncentrowana na
pliku fstab
przeznaczonego na konkretne urządzenia i kilka historycznych plików/zmiennej konfiguracji statycznej.
usunięte, by zapewnić bardziej dynamiczne zachowanie:
- Nakładka zasobu
storage_list.xml
została usunięta i platforma nie jest już używana. Urządzenia pamięci masowej są teraz konfigurowane dynamicznie w przypadku ich wykrycia przezvold
. - Zmienne środowiskowe
EMULATED_STORAGE_SOURCE/TARGET
zostały usunięte i nie są już używane przez Zygote do skonfigurować punkty podłączania specyficzne dla użytkownika. Zamiast tego wymuszane jest rozdzielenie użytkowników z identyfikatorami GID poszczególnych użytkowników, a podstawowa pamięć współdzielona jest podłączana przezvold
w czasie działania.- Deweloperzy mogą nadal tworzyć ścieżki dynamicznie lub statycznie w zależności od
dla konkretnego przypadku użycia. Wpisanie identyfikatora UUID w ścieżce wskazuje kartę do utworzenia
lokalizacji dla programistów. (Na przykład
/storage/ABCD-1234/report.txt
jest wyraźnie innym plikiem niż/storage/DCBA-4321/report.txt
).
- Deweloperzy mogą nadal tworzyć ścieżki dynamicznie lub statycznie w zależności od
dla konkretnego przypadku użycia. Wpisanie identyfikatora UUID w ścieżce wskazuje kartę do utworzenia
lokalizacji dla programistów. (Na przykład
- Zakodowane na stałe usługi FUSE zostały usunięte z plików
init.rc
związanych z konkretnym urządzeniem i w razie potrzeby są dynamicznie rozwidzane zvold
.
Oprócz tych zmian w konfiguracji w Androidzie 6.0 wprowadziliśmy możliwość pamięci uniwersalnej. W przypadku urządzeń z Androidem 6.0 wszelkie nośniki fizyczne, które nie są jest postrzegana jako przenośna.
Pamięć elastyczna
Aby wskazać w systemie fstab
urządzenie pamięci masowej, 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 wdrożeniu urządzenia pamięci masowej platforma usuwa zawartość i zapisuje Tabela partycji GUID, która definiuje 2 partycje:
- małą pustą partycję
android_meta
zarezerwowaną do użycia w przyszłości. Identyfikator GUID typu partycji to 19A710A2-B3CA-11E4-B026-10604B889DCF. - dużą partycję
android_ext
szyfrowaną przy użyciu dm-crypt i sformatowaną przy użyciuext4
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 zasadzie fstab
urządzenia pamięci masowej z atrybutem voldmanaged
są domyślnie uznawane za przenośne, chyba że inny atrybut
jak encryptable=userdata
. Oto 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 podłączeniem, a użytkownicy mogą sformatować plik
multimedia, jeśli system plików nie jest obsługiwany.