Konfiguracja urządzenia

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 to nonremovable i encryptable.

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 to vfat.
  • mnt_flags: pole Vold 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ą flagi voldmanaged= w tym polu. Ta flaga musi znajduje się po nim etykieta opisująca kartę oraz numer partycji lub słowo auto Oto przykład: voldmanaged=sdcard:auto. Inne możliwe flagi to nonremovable, encryptable=sdcard, noemulatedsd i encryptable=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 przez vold.
  • 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 przez vold 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).
  • 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 z vold.

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życiu ext4 lub f2fs 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.