外部存储由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
在装入以前检测文件系统类型,而且当文件系统不受支持时,用户能够选择格式化媒体。