Android系统通过vold层完成磁盘的热插拔(包括:挂载、卸载、格式化等)功能。
Android中的vold模块处于Framework层和linux内核层之间,启到呈上启下的作用。
本篇将从主线程流程(main函数),以及类结构的角度来分析vold的实现原理,详细分析的博文地址为:
Androidvold启动篇(NetlinkHandler)
Android vold通讯篇(CommandListener)
一、vold下主流程代码分析
在关键代码行后有注释:
int main() {
VolumeManager *vm; //管理volume
CommandListener *cl;//和Framework进行通讯
NetlinkManager *nm;//接收内核消息
SLOGI("Vold 2.1 (the revenge) firing up");
mkdir("/dev/block/vold", 0755);//创建设备节点
/* For when cryptfs checks and mounts an encrypted filesystem */
klog_set_level(6);
/* Create our singleton managers */
if (!(vm = VolumeManager::Instance())) {
SLOGE("Unable to create VolumeManager");
exit(1);
};
if (!(nm = NetlinkManager::Instance())) {
SLOGE("Unable to create NetlinkManager");
exit(1);
};
cl = new CommandListener();
vm->setBroadcaster((SocketListener *) cl);
nm->setBroadcaster((SocketListener *) cl);
if (vm->start()) {//啥也没干
SLOGE("Unable to start VolumeManager (%s)", strerror(errno));
exit(1);
}
if (process_config(vm)) {//根据配置文件/etc/vold.fstab,初始化VolumeManager
SLOGE("Error reading configuration (%s)... continuing anyways", strerror(errno));
}
if (nm->start()) {//启动内核监听
SLOGE("Unable to start NetlinkManager (%s)", strerror(errno));
exit(1);
}
coldboot("/sys/block");//触发内核sysfs发送uevent事件
// coldboot("/sys/class/switch");
/*
* Now that we're up, we can respond to commands
*/
if (cl->startListener()) {//启动对Framework的监听
SLOGE("Unable to start CommandListener (%s)", strerror(errno));
exit(1);
}
// Eventually we'll become the monitoring thread
while(1) {
sleep(1000);
}
SLOGI("Vold exiting");
exit(0);
}
以上为主代码流程,这里看不明白正常,只需要了解这个过程,前面有三篇博文详细分析了这个过程。
二、vold的类框架及数据流
黄色线:为类和类、类和接口及类和对象的UML关系;
绿色线:内核发送挂载消息传到vold层,vold进行处理的数据流;
红色线:vold处理完成内核消息后,向Framework层发送的消息数据流;以及Framewrok层向vold发送消息后,vold层向Framework层发送的消息数据流;
黑色线:应用层调用API到Framewrok层,再到vold层,再到内核函数的数据流。