Android 源码分析 - 存储 - 流程

线程

        MountService:

名称

入口

说明

MountService

Looper.loop()

MountServiceHandler

android.io

Looper.loop()

ObbActionHandler

VoldConnector

NativeDaemonConnector.run()

从Vold接收数据

vold启动

  • 主函数(main)
  1. mkdir()【创建目录:"/dev/block/vold"】
  2. VolumeManager::Instance()
  3. NetlinkManager::Instance()
  4. new CommandListener()
  5. vm->setBroadcaster()【通过CommandListener广播到所有客户端】
  6. nm->setBroadcaster()【通过CommandListener广播到所有客户端】
  7. vm->start()
  8. process_config()【处理配置文件】
  9. nm->start()
    1. socket()【PF_NETLINK,NETLINK_KOBJECT_UEVENT】
    2. new NetlinkHandler()
    3. mHandler->start()
  10. coldboot()【"/sys/block"】
    1. 打开目录和所有子目录的“uevent”文件,写入“add\n”。??
  11. cl->startListener()
  • 处理配置文件(process_config)
  1. fs_mgr_read_fstab()【"/fstab."${ro.hardware}】
  2. for e : fstab->num_entries
    1. new DirectVolume()
    2. dv->addPath()
    3. vm->addVolume()

创建ASEC

下面这些步骤的最终目标是创建了一个asec文件,里面包含一个加密的文件系统和超级块(最后一个扇区,保存版本号和文件系统属性)。

后面要挂载asec,要执行的步骤是这里的子集。

  1. 创建asec文件【/data/app-asec/<id>.asec或者/mnt/secure/asec/<id>.asec】
    1. 大小:(numImgSectors + 1) * 512
  2. 创建循环设备,指向asec文件【/dev/block/loop<N>,名称crypt_name=idHash】
  3. 创建逻辑设备映射循环设备【/dev/block/dm-<dev>,加密,绑定名称idHash】
  4. 在循环设备最后一个扇区写入超级块【asec_superblock】
  5. 格式化逻辑设备【Ext4或者Fat】
  6. 创建挂载点【/mnt/asec/<id>】
  7. 挂载逻辑设备
  8. 修改挂载点的用户属性【AID_SYSTEM】

挂载

  1. Volume::mountVol()
    1. ${vold.decrypt}【加密状态】
    2. ${vold.encrypt_progress}【正在加密】
    3. getDeviceNodes()【派生类,有可能多个分区,或者一个完整分区】
      1. 【设备文件路径:/dev/block/vold/<major>:<minor>】
    4. ${ro.crypto.state}【配置加密方式】
    5. if (!isDecrypted())
      1. cryptfs_setup_volume()【创建逻辑设备映射】
      2. get_crypt_ftr_and_key()
        1. get_crypt_ftr_info()
          1. fs_mgr_get_crypt_info()【从fstab里面读取加密信息文件位置】
        2. read()【从文件读取加密信息crypt_mnt_ftr,版本<=1.2】
      3. create_crypto_blk_dev()【创建逻辑设备映射】
        1. load_crypto_mapping_table()【加载加密表】
          1. 【加密参数:<crypto_type> <master_key> 0 <real_blk_name> 0 <extra_params>】
      4. createDeviceNode()【逻辑设备/dev/block/vold/<major>:<minor>】
        1. mknod()
      5. updateDeviceInfo()【派生类,更新设备信息】
      6. getDeviceNodes()【获取更新后的设备节点】
    6. end-if【!isDecrypted()】
    7. for i : [0, n)【针对每个分区】
      1. if (Fat::check())
        1. continue【没有fat文件系统】
      2. getMountpoint()【派生类实现】
      3. Fat::doMount()
      4. extractMetadata()
        1. popen()【/system/bin/blkid  -c /dev/null <devicePath>】
        2. setUuid()
        3. setUserLabel()
      5. if (providesAsec)
        1. mountAsecExternal()
          1. secure_path【getMountpoint()/.android_secure/】
          2. fs_prepare_dir()【创建secure_path,并设置权限】
          3. mount()【secure_path -> /mnt/secure/asec/, MS_BIND】
      6. end-if【providesAsec】
    8. end-for

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fighting Horse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值