Konfiguracja urzadzenia

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

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 zwykle vfat .
  • mnt_flags : Vold ignoruje to pole i powinno zostać ustawione na defaults
  • fs_mgr_flags : Vold ignoruje wszystkie linie w ujednoliconym fstabie, które nie zawierają flagi voldmanaged= w tym polu. Po tej fladze musi następować 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 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 przez vold .
  • 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 przez vold 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 .)
  • 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 z vold .

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