<Android开发> Android内核系统开发- 启动过程详解 (第4部分 延伸内容 存储设备与多用户)

<Android开发> Android内核系统开发- 启动过程详解 (第4部分 延伸内容 存储设备与多用户)

Vold 和External Storage存储设备

与IOS不同的是,Android系统支持多种存储设备,包括外置的SDCARD、U盘等。这些存储设备的管理机制在不同的Android版本中差异很大, 将在这部分延伸内容分析。

Android系统中的内外存储设备定义如下:

  • Internal Storage
    按照Android的设计理念,Internal Storage代表的是/data存储目录。所以目前不少文件管理器事实上混淆了Internal Storage的概念,这点需要注意。
  • External Storage
    所有除了Internal Storage之外的可存储区域,参见下面详述。
    从物理设备的角度来看External Storage由如下几种类型组成:
  • (1)Emulated Storage
    Android设备中存在的一个典型做法,是从Internal Storage(如Flash)中划分一定的区域(如1GB)来作为外部存储设备,称为Emulated Storage。
  • (2)SDCARD/USB Devices
    通过扩展卡槽或者USB端口来扩展设备的存储能力,也是Android设备中的常见情况。

另外在某些场合,Android 6.0之前的External Storage会被称为Traditional Storage,从这个角度看它又可以细分成emulated和portable storage两个类型。Portable顾名思义就是指那些没有和系统绑定在一起的,可以随时移除的设备。正是由于这类设备的“暂时性和不稳定性”,它们并不适合用于存储一些敏感数据,例如系统代码/应用程序数据等。Android 6.0则引入了一种叫做“Adoptable storage"的存储概念,简单来说就是让外部存储设备可以像内部设备一样被处理。
为了达到上述的效果,被“Adoptable”的存储设备需要格式化并经过加密过程,以保证数据的安全性。当然,系统会在用户插入新的外部设备时首先询问是否要把它变成“Adoptable storage”。如果答案时肯定的才会执行这些处理;否则还是把它当做普通的存储设备。
Android系统中的外部存储设备由Vlod和MountService 来统一管理。其中Vlod对应的源码路径是“system/vold“。它是通过init.rc启动的,如下:

/* system/core/rootdir/init.rc */
.....
on early-fs
    # Once metadata has been mounted, we'll need vold to deal with userdata checkpointing
    # 一旦元数据被挂载,我们需要vold来处理用户数据检查点
    start vold
.......
on post-fs-data
    mark_post_data

    # Start checkpoint before we touch data
    # 在我们接触数据之前启动检查点
    start vold

值得一提的是FUSE services也不再放在init.rc中统一加载,而改由vold根据具体情况来动态决定是否需要启动。
Vold在启动后,会通过NETLINK和内核取得联系,并根据后者提供的的event来构建存储设备管理系统。和以往版本不同的是,Vold的配置文件不再是vold.fstab,而改成了/fstab.<ro.hardware>。如下:

/* device/qcom/msmnile_au/fstab.qcom */

# Android fstab file.
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK

#TODO: Add 'check' as fs_mgr_flags with data partition.
# Currently we dont have e2fsck compiled. So fs check would failed.

# Android fstab 文件。
# 包含文件系统检查器二进制文件的文件系统(通常是 /system)不能
# 指定 MF_CHECK,并且必须在任何指定 MF_CHECK 的文件系统之前

#TODO:将“检查”添加为带有数据分区的 fs_mgr_flags。
# 目前我们没有编译 e2fsck。 所以 fs 检查会失败。

#<src>                                                 <mnt_point>            <type>  <mnt_flags and options>                            <fs_mgr_flags>
/dev/block/bootdevice/by-name/system                    /                      ext4    ro,barrier=1,discard                                 wait,slotselect,avb
/dev/block/bootdevice/by-name/metadata                  /metadata              ext4    noatime,nosuid,nodev,discard                         wait,formattable
/dev/block/bootdevice/by-name/userdata                  /data                  ext4    noatime,nosuid,nodev,barrier=1,noauto_da_alloc,discard latemount,wait,check,fileencryption=ice,wrappedkey,keydirectory=/metadata/vold/metadata_encryption,quota,reservedsize=128M
/devices/platform/soc/8804000.sdhci/mmc_host*           /storage/sdcard1       vfat    nosuid,nodev                                         latemount,wait,voldmanaged=sdcard1:auto,encryptable=footer
/devices/platform/soc/1da4000.ufshc_card/host*          /storage/sdcard1       vfat    nosuid,nodev                                         latemount,wait,voldmanaged=sdcard1:auto,encryptable=footer
/dev/block/bootdevice/by-name/modem                     /vendor/firmware_mnt   vfat    ro,shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0 wait,slotselect
/dev/block/bootdevice/by-name/dsp                       /vendor/dsp            ext4    ro,nosuid,nodev,barrier=1                            latemount,wait,slotselect
/dev/block/bootdevice/by-name/persist                   /mnt/vendor/persist    ext4    noatime,nosuid,nodev,barrier=1                       wait
/dev/block/bootdevice/by-name/bluetooth                 /vendor/bt_firmware    vfat    ro,shortname=lower,uid=1002,gid=3002,dmask=227,fmask=337,context=u:object_r:bt_firmware_file:s0 latemount,wait,slotselect
# Need to have this entry in here even though the mount point itself is no longer needed.
# The update_engine code looks for this entry in order to determine the boot device address
# and fails if it does not find it.
# 即使不再需要挂载点本身,也需要在此处输入此条目。
# update_engine 代码查找此条目以确定引导设备地址,如果找不到则失败。
/dev/block/bootdevice/by-name/misc                      /misc                  emmc    defaults                                             defaults
/devices/platform/soc/*.ssusb/*.dwc3/xhci-hcd.*.auto*    /storage/usbotg    vfat    nosuid,nodev    latemount,wait,voldmanaged=usbotg:auto

Android 6.0 及以后版本中,根据设备具体情况不同主要由如下几种典型配置ÿ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

waterfxw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值