一 Vold工作机制分析
vold进程:管理和控制Android平台外部存储设备,包括SD插拨、挂载、卸载、格式化等;
vold进程接收来自内核的外部设备消息。
Vold框架图如下:
Vold接收来自内核的事件,通过netlink机制。
Netlink 是一种特殊的 socket;
Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的socket API 就可以使用 netlink 提供的强大功能;
Netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中;
内核通过Netlink发送uEvent格式消息给用户空间程序;外部设备发生变化,Kernel发送uevent消息。
二 Vold进程启动过程
service vold /system/bin/vold
class core
socket vold stream 0660 root mount
ioprio be 2
三 vold进程执行过程:
\system\vold\main.cpp
{
//初始化Vold相关的类实例 single
vm = VolumeManager::Instance();
nm = NetlinkManager::Instance();
cl = new CommandListener(); //CommandListener 创建vold socket监听上层消息
vm->setBroadcaster((SocketListener *) cl);
nm->setBroadcaster((SocketListener *) cl);
//启动VolumeManager
vm->start();
//根据配置文件/etc/vold.fstab 初始化VolumeManager
process_config(vm);
//启动NetlinkManager socket监听内核发送uevent
nm->start();
//向/sys/block/目录下所有设备uevent文件写入“add\n”,
//触发内核sysfs发送uevent消息
coldboot("/sys/block");
//启动CommandListener监听vold socket
cl->startListener();
}
1 NetlinkManager模块
NetlinkManager模块接收从Kernel发送的Uevent消息,解析转换成NetlinkEvent对象;再将此NetlinkEvent对象传递给VolumeManager处理。
NetlinkHandler::onEvent(NetlinkEvent *evt)
2 VolumeManager模块
此模块管理所有挂载的设备节点以及相关操作执行;下面是VolumeManager模块类结构图:
从NetlinkManager到VolumeManager代码过程
(vm->start())
VolumeManager::handleBlockEvent(NetlinkEvent *evt) //函数执行从onEvent到handleBlockEvent:
DirectVolume::handleBlockEvent(NetlinkEvent *evt) //这里的Volume为其派生类DirectVolume。
3 CommandListener接收到来自Framework层得消息,派发命令处理,再传递给VolumeManager处理。
CommandListener监听Socket,使Vold与Framework层进行进程通信;
其相关类继承结构图如下:
CommandListener实例的创建:构造函数
CommandListener构造函数:
CommandListener::CommandListener() : //注册Framework发送的相关命令 Command模式
FrameworkListener("vold", true) {
registerCmd(new DumpCmd());
registerCmd(new VolumeCmd());
registerCmd(new AsecCmd());
registerCmd(new ObbCmd());
registerCmd(new StorageCmd());
registerCmd(new XwarpCmd());
registerCmd(new CryptfsCmd());
}
Command执行处理:以VolumeCommand为例
//获取VolumeManager实例
1. VolumeManager *vm = VolumeManager::Instance();
//Action判断 传递给VolumeManager处理
.
.
2. } else if (!strcmp(argv[1], "mount")) {
rc = vm->mountVolume(argv[2]);
.
3.VolumeManager中Action处理:
int VolumeManager::mountVolume(const char *label) {
整个Vold处理过程框架图如下:
参考:http://www.cnblogs.com/bastard/archive/2012/12/03/2799298.html
ATC 8217