Android存储(3)-- 设备配置

2,178 阅读5分钟

外部存储由vold init服务和MountService系统服务的组合管理。物理外部存储卷的安装由vold处理,vold执行临时操作以在将媒体暴露给应用程序之前准备媒体。

文件映射

对于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:可选的逗号分隔的标志列表,不能包含/。可能的值包括不可删除和可加密。

对于Android 4.3版本和更高版本,initvoldrecovery使用的各种fstab文件在/fstab.<device>文件中统一。对于由vold管理的外部存储卷,条目应具有以下格式:

<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服务添加:

# 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环境变量定义为主外部存储器的路径。/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动态分支。

除了这些配置更改,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在装入之前检测文件系统类型,并且当文件系统不受支持时,用户可以选择格式化媒体。