設備配置

外部存儲由vold init服務和StorageManagerService系統服務的組合進行管理。物理外部存儲卷的掛載由vold處理,該命令將執行階段操作以準備媒體,然後再將其公開給應用程序。

注意:在Android 8.0中,將MountService類重命名為StorageManagerService

文件映射

對於Android 4.2.2和更早版本,特定於設備的vold.fstab配置文件定義從sysfs設備到文件系統掛載點的映射,並且每一行都遵循以下格式:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
  • label :卷的標籤。
  • mount_point :應在其中安裝卷的文件系統路徑。
  • partition :分區號(從1開始),或者對於第一個可用分區為'auto'。
  • sysfs_path :可以提供此安裝點的設備的一個或多個sysfs路徑。用空格分隔,並且每個空格都必須以/開頭。
  • flags :可選的逗號分隔標誌列表,不能包含/ 。可能的值包括nonremovable和可encryptable

對於Android 4.3及更高版本,init,vold和recovery使用的各種fstab文件統一在/fstab.<device>文件中。對於由vold管理的外部存儲卷,條目應採用以下格式:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src :sysfs下的路徑(通常在/ sys掛載)到可以提供掛載點的設備的路徑。路徑必須以/開頭。
  • mount_point :應在其中安裝卷的文件系統路徑。
  • type :卷上文件系統的類型。對於外部卡,通常為vfat
  • mnt_flagsVold忽略此字段,應將其設置為defaults
  • fs_mgr_flagsVold忽略統一fstab中任何在此字段中不包括voldmanaged=標誌的行。該標誌後必須跟有描述卡的標籤,分區號或單詞auto 。這是一個示例: voldmanaged=sdcard:auto 。其他可能的標誌是nonremovableencryptable=sdcardnoemulatedsdencryptable=userdata

配置詳細信息

框架級別或更高級別的外部存儲交互通過StorageManagerService處理。由於Android 6.0中的配置更改(例如刪除了storage_list.xml資源覆蓋),配置詳細信息分為兩類。

Android 5.x及更早版本

特定於設備的storage_list.xml配置文件(通常通過frameworks/base覆蓋圖提供)定義了存儲設備的屬性和約束。 <StorageList>元素包含一個或多個<storage>元素,恰好其中之一應標記為primary。 <storage>屬性包括:

  • mountPoint :此安裝的文件系統路徑。
  • storageDescription :描述此安裝的字符串資源。
  • primary :如果此裝載是主要的外部存儲,則為true。
  • removable :如果此安裝具有可移動媒體(例如物理SD卡),則為true。
  • emulated :如果emulated此安裝並由內部存儲支持(可能使用FUSE守護程序),則為true。
  • mtp-reserve :MTP應該為免費存儲保留的存儲MB數。僅在將安裝標記為仿真時使用。
  • allowMassStorage :如果可以通過USB大容量存儲共享此安裝, allowMassStorage true。
  • maxFileSize :最大文件大小(以MB為單位)。

設備可以通過模擬不區分大小寫,無權限的文件系統(由內部存儲支持)來提供外部存儲。 FUSE守護程序在system/core/sdcard提供了一種可能的實現,可以將其添加為特定init.rc設備的init.rc服務:

# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
    class late_start

其中source_path是後備內部存儲器, dest_path是目標安裝點。

在配置特定init.rc設備的init.rc腳本時,必須將EXTERNAL_STORAGE環境變量定義為主外部存儲的路徑。 /sdcard路徑也必須通過符號鏈接解析到相同的位置。如果設備在平台更新之間調整外部存儲的位置,則應創建符號鏈接,以便舊路徑繼續起作用。

Android 6.0

現在,存儲子系統的配置集中在特定於設備的fstab文件中,並且已刪除了一些歷史靜態配置文件/變量以支持更多動態行為:

  • storage_list.xml資源覆蓋已被刪除,框架不再使用。現在由vold檢測到動態配置存儲設備。
  • EMULATED_STORAGE_SOURCE/TARGET環境變量已被刪除,Zygote不再使用它來配置用戶特定的安裝點。取而代之的是,現在使用特定於用戶的GID強制執行用戶分離,並且主共享存儲在運行時由vold安裝到位。
    • 開發人員可以根據其用例繼續動態或靜態地構建路徑。在路徑中包括UUID可以識別每張卡,以使開發人員可以更清楚地看到位置。 (例如, /storage/ABCD-1234/report.txt顯然是一個不同的文件比/storage/DCBA-4321/report.txt 。)
  • 硬編碼的FUSE服務已從特定於設備的init.rc文件中刪除,而是在需要時從vold動態派生。

除了這些配置更改外,Android 6.0還包括可採用的存儲概念。對於Android 6.0設備,任何未採用的物理媒體都被視為可移植的。

可採用的存儲

要在fstab指示可採用的存儲設備,請使用fs_mgr_flags字段中的encryptable=userdata屬性。這是一個典型的定義:

/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
voldmanaged=sdcard1:auto,encryptable=userdata

當採用存儲設備時,平台將擦除內容並寫入定義兩個分區的GUID分區表:

  • 一個小的android_meta空分區,保留供將來使用。分區類型GUID是19A710A2-B3CA-11E4-B026-10604B889DCF。
  • 一個大型android_ext分區,該分區使用dm-crypt加密,並根據內核功能使用ext4f2fs格式化。分區類型GUID是193D1EA4-B3CA-11E4-B075-10604B889DCF。

便攜式存儲

fstab ,默認情況下,具有voldmanaged屬性的存儲設備被視為可移植的,除非定義了另一個屬性,例如encryptable=userdata 。例如,這是USB OTG設備的典型定義:

/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
                                                    voldmanaged=usb:auto

該平台使用blkid在掛載之前檢測文件系統類型,並且當文件系統不受支持時,用戶可以選擇格式化介質。