Android存儲(3)-- 設備配置

外部存儲由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版本和更高版本,initvoldrecovery使用的各類fstab文件在/fstab.<device>文件中統一。對於由vold管理的外部存儲卷,條目應具備如下格式:android

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>複製代碼
  • srcsysfs(一般安裝在/sys)下面的路徑到能夠提供裝入點的設備。路徑必須以/開頭。
  • mount_point:安裝卷的文件系統路徑。
  • type:捲上的文件系統的類型。對於外部卡,這一般是vfat
  • mnt_flagsVold忽略此字段,應將其設置爲defaults
  • fs_mgr_flagsVold忽略統一fstab中不包括此字段中的voldmanaged=標誌的任何行。此標誌後面必須跟有描述卡的標籤,分區號或單詞auto。這裏是一個例子:voldmanaged = sdcard:auto。其餘可能的標誌是nonremovableencryptable = sdcardnoemulatedsdencryptedable = userdata

配置詳細信息

框架級別及以上的外部存儲交互經過MountService進行處理。因爲Android6.0中的配置更改(如刪除storage_list.xml資源覆蓋),配置詳細信息分爲兩類。後端

Android 5.x and earlier框架

Android 5.x和更早版本

特定於設備的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

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動態分支。

除了這些配置更改,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分區,留做未來使用。分區類型GUID19A710A2-B3CA-11E4-B026-10604B889DCF。一個大的android_ext分區,使用dm-crypt加密,並根據內核功能使用ext4f2fs格式化。分區類型GUID193D1EA4-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在裝入以前檢測文件系統類型,而且當文件系統不受支持時,用戶能夠選擇格式化媒體。

相關文章
相關標籤/搜索