外部存儲由vold init
服務和MountService
系統服務的組合管理。物理外部存儲卷的安裝由vold
處理,vold
執行臨時操做以在將媒體暴露給應用程序以前準備媒體。javascript
對於Android 4.2.2及更早版本,設備特定的vold.fstab
配置文件定義了從sysfs
設備到文件系統掛接點的映射,每行都遵循如下格式:java
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]複製代碼
label
:卷的標籤。mount_point
:安裝卷的文件系統路徑。partition
:分區編號(基於1),或第一個可用分區的「auto」。sysfs_path
:能夠提供此裝入點的設備的一個或多個sysfs路徑。用空格分隔,每一個都必須以/
開頭。flags
:可選的逗號分隔的標誌列表,不能包含/
。可能的值包括不可刪除和可加密。對於Android 4.3版本和更高版本,init
,vold
和recovery
使用的各類fstab
文件在/fstab.<device>
文件中統一。對於由vold
管理的外部存儲卷,條目應具備如下格式:android
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>複製代碼
src
:sysfs
(一般安裝在/sys
)下面的路徑到能夠提供裝入點的設備。路徑必須以/
開頭。mount_point
:安裝卷的文件系統路徑。type
:捲上的文件系統的類型。對於外部卡,這一般是vfat
。mnt_flags
:Vold
忽略此字段,應將其設置爲defaults
fs_mgr_flags
:Vold
忽略統一fstab
中不包括此字段中的voldmanaged=
標誌的任何行。此標誌後面必須跟有描述卡的標籤,分區號或單詞auto
。這裏是一個例子:voldmanaged = sdcard:auto
。其餘可能的標誌是nonremovable
,encryptable = sdcard
,noemulatedsd
和encryptedable = userdata
。框架級別及以上的外部存儲交互經過MountService
進行處理。因爲Android6.0中的配置更改(如刪除storage_list.xml
資源覆蓋),配置詳細信息分爲兩類。後端
Android 5.x and earlier框架
特定於設備的storage_list.xml
配置文件一般經過frameworks/base
覆蓋來提供,定義了存儲設備的屬性和約束。<StorageList>
元素包含一個或多個<storage>
元素,其中一個應標記爲主。<storage>
屬性包括:編碼
mountPoint
:此安裝的文件系統路徑。storageDescription
:描述此安裝的字符串資源。primary
:若是此安裝是主外部存儲,則爲true。removable
:若是此安裝程序具備可移動介質(如物理SD卡),則爲true。emulated
:true若是此安裝被模擬並由內部存儲器支持,可能使用FUSE
守護程序。mtp-reserve
:MTP應爲免費存儲預留的存儲的MB數。僅當安裝標記爲模擬時使用。allowMassStorage
:若是此安裝可經過USB大容量存儲共享,則爲true。maxFileSize
:最大文件大小(MB)。加密
設備能夠經過模擬由內部存儲支持的不區分大小寫,無權限的文件系統來提供外部存儲。一個可能的實現由system/core/sdcard
中的FUSE
守護程序提供,能夠做爲設備特定的init.rc
服務添加:spa
# 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
是目標安裝點。code
在配置特定於設備的init.rc
腳本時,必須將EXTERNAL_STORAGE
環境變量定義爲主外部存儲器的路徑。/sdcard
路徑還必須解析到相同的位置,可能經過符號連接。 若是設備在平臺更新之間調整外部存儲的位置,應該建立符號連接,以便舊路徑繼續工做。orm
存儲子系統的配置如今集中在特定於設備的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
動態分支。
除了這些配置更改,Android6.0包括可採用的存儲的概念。對於Android6.0設備,任何未採用的物理介質都被視爲可移植。
Adoptable storage
要在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
加密,並根據內核功能使用ext4
或f2fs
格式化。分區類型GUID
爲193D1EA4-B3CA-11E4-B075-10604B889DCF
。
Portable storage
在fstab
中,默認狀況下具備voldmanaged
屬性的存儲設備是可移植的,除非定義了另外一個屬性,如encryptedable = userdata
。例如,如下是USB OTG設備的典型定義:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto複製代碼
該平臺使用blkid
在裝入以前檢測文件系統類型,而且當文件系統不受支持時,用戶能夠選擇格式化媒體。