线程
MountService:
名称 | 入口 | 说明 |
MountService | Looper.loop() | MountServiceHandler |
android.io | Looper.loop() | ObbActionHandler |
VoldConnector | NativeDaemonConnector.run() | 从Vold接收数据 |
vold启动
- 主函数(main)
- mkdir()【创建目录:"/dev/block/vold"】
- VolumeManager::Instance()
- NetlinkManager::Instance()
- new CommandListener()
- vm->setBroadcaster()【通过CommandListener广播到所有客户端】
- nm->setBroadcaster()【通过CommandListener广播到所有客户端】
- vm->start()
- process_config()【处理配置文件】
- nm->start()
- socket()【PF_NETLINK,NETLINK_KOBJECT_UEVENT】
- new NetlinkHandler()
- mHandler->start()
- coldboot()【"/sys/block"】
- 打开目录和所有子目录的“uevent”文件,写入“add\n”。??
- cl->startListener()
- 处理配置文件(process_config)
- fs_mgr_read_fstab()【"/fstab."${ro.hardware}】
- for e : fstab->num_entries
- new DirectVolume()
- dv->addPath()
- vm->addVolume()
创建ASEC
下面这些步骤的最终目标是创建了一个asec文件,里面包含一个加密的文件系统和超级块(最后一个扇区,保存版本号和文件系统属性)。
后面要挂载asec,要执行的步骤是这里的子集。
- 创建asec文件【/data/app-asec/<id>.asec或者/mnt/secure/asec/<id>.asec】
- 大小:(numImgSectors + 1) * 512
- 创建循环设备,指向asec文件【/dev/block/loop<N>,名称crypt_name=idHash】
- 创建逻辑设备映射循环设备【/dev/block/dm-<dev>,加密,绑定名称idHash】
- 在循环设备最后一个扇区写入超级块【asec_superblock】
- 格式化逻辑设备【Ext4或者Fat】
- 创建挂载点【/mnt/asec/<id>】
- 挂载逻辑设备
- 修改挂载点的用户属性【AID_SYSTEM】
挂载
- Volume::mountVol()
- ${vold.decrypt}【加密状态】
- ${vold.encrypt_progress}【正在加密】
- getDeviceNodes()【派生类,有可能多个分区,或者一个完整分区】
- 【设备文件路径:/dev/block/vold/<major>:<minor>】
- ${ro.crypto.state}【配置加密方式】
- if (!isDecrypted())
- cryptfs_setup_volume()【创建逻辑设备映射】
- get_crypt_ftr_and_key()
- get_crypt_ftr_info()
- fs_mgr_get_crypt_info()【从fstab里面读取加密信息文件位置】
- read()【从文件读取加密信息crypt_mnt_ftr,版本<=1.2】
- get_crypt_ftr_info()
- create_crypto_blk_dev()【创建逻辑设备映射】
- load_crypto_mapping_table()【加载加密表】
- 【加密参数:<crypto_type> <master_key> 0 <real_blk_name> 0 <extra_params>】
- load_crypto_mapping_table()【加载加密表】
- createDeviceNode()【逻辑设备/dev/block/vold/<major>:<minor>】
- mknod()
- updateDeviceInfo()【派生类,更新设备信息】
- getDeviceNodes()【获取更新后的设备节点】
- end-if【!isDecrypted()】
- for i : [0, n)【针对每个分区】
- if (Fat::check())
- continue【没有fat文件系统】
- getMountpoint()【派生类实现】
- Fat::doMount()
- extractMetadata()
- popen()【/system/bin/blkid -c /dev/null <devicePath>】
- setUuid()
- setUserLabel()
- if (providesAsec)
- mountAsecExternal()
- secure_path【getMountpoint()/.android_secure/】
- fs_prepare_dir()【创建secure_path,并设置权限】
- mount()【secure_path -> /mnt/secure/asec/, MS_BIND】
- mountAsecExternal()
- end-if【providesAsec】
- if (Fat::check())
- end-for