外部儲存空間由 vold
初始化管理
服務和「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 式) 或「自動」第一個可用的分區sysfs_path
:一或多個 sysfs 路徑,連往可提供此掛接的裝置 點。以空格分隔,每個開頭都必須以/
開頭。flags
:以半形逗號分隔的標記清單 (以半形逗號分隔),不得包含/
。 可能的值包括nonremovable
和encryptable
。
在 Android 4.3 以上版本中,init、vold 和
復原為 /fstab.<device>
檔案中的復原程序。外部用
由 vold
管理的儲存空間磁碟區,項目應有
格式如下:
<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
和encryptable=userdata
。
設定詳細資料
處理架構層級或以上的外部儲存空間互動
至 StorageManagerService
。由於
Android 6.0 (例如移除 storage_list.xml 資源疊加層),
設定詳細資料分為兩類
Android 5.x 以下版本
裝置專屬的 storage_list.xml
設定
檔案 (通常是透過 frameworks/base
疊加層提供) 會定義
確定所有必要的屬性和限制<StorageList>
元素
包含一或多個 <storage>
元素,應該有一個標記
。<storage>
屬性包括:
mountPoint
:此掛接的檔案系統路徑。storageDescription
:說明此掛接的字串資源。primary
:如果這個掛接是主要外部儲存空間,則為 true。removable
:如果這個掛架有卸除式媒體 (例如實體 SD 標準畫質),則為 true 資訊卡emulated
:如果這個掛接是模擬的,且由內部儲存空間提供支援,則傳回 true, 就可能在使用 FUSE Daemon。mtp-reserve
:MTP 應免費保留的儲存空間 MB 大小 如果 30 天內讀取資料不到一次 建議使用 Coldline Storage只有在掛接狀態標示為模擬時才能使用。allowMassStorage
:如果這個掛接可透過 USB 大量儲存裝置共用,則為 true。maxFileSize
:檔案大小上限 (MB)。
裝置可能會模擬不區分大小寫,藉此提供外部儲存空間
由內部儲存空間支援的無權限檔案系統其中一個可能
FUSE Daemon 是由 system/core/sdcard
中的 FUSE Daemon 提供,可
會新增為裝置專屬的 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
指令碼時,EXTERNAL_STORAGE
必須將環境變數定義為主要外部
如果 30 天內讀取資料不到一次
建議使用 Coldline Storage/sdcard
路徑也必須解析為相同位置,可能
經由符號連結傳送出去裝置調整外部儲存空間位置
平台更新和符號連結都應建立,讓舊路徑繼續運作。
Android 6.0
儲存子系統設定現在集中在
和一些歷史靜態設定檔/變數fstab
來支援更多動態行為:
storage_list.xml
資源疊加層已移除,架構不再使用。 現在,「vold
」偵測到儲存裝置時,系統會動態設定儲存裝置。EMULATED_STORAGE_SOURCE/TARGET
環境變數已移除,Zygote 已不再使用 設定使用者專屬的掛接點而是改為強制執行使用者區隔 ,且主要共用儲存空間會掛接在執行階段,由vold
安裝。- 開發人員可以繼續動態或靜態建構路徑,實際取決於
思考如何引導使用者完成任務如在路徑中加入 UUID,就能識別每張卡片
開發人員可以更清楚地掌握位置(例如,
/storage/ABCD-1234/report.txt
顯然與/storage/DCBA-4321/report.txt
是不同的檔案)。
- 開發人員可以繼續動態或靜態建構路徑,實際取決於
思考如何引導使用者完成任務如在路徑中加入 UUID,就能識別每張卡片
開發人員可以更清楚地掌握位置(例如,
- 硬式編碼的 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。 - 使用 dm-crypt 加密的大型
android_ext
分區,並根據核心功能使用ext4
或f2fs
進行格式化。分區類型 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
在掛接前偵測檔案系統類型,而使用者可以選擇將
媒體檔案。