9.2.2 初识Vold
最后更新于:2022-04-02 05:53:14
下面来认识一下Vold,它的代码在main.cpp中,如下所示:
**Main.cpp**
~~~
int main() {
VolumeManager *vm;
CommandListener *cl;
NetlinkManager *nm;
SLOGI("Vold 2.1 (the revenge) firing up");
//创建文件夹/dev/block/vold
mkdir("/dev/block/vold", 0755);
//①创建VolumeManager对象
if(!(vm = VolumeManager::Instance())) {
SLOGE("Unable to create VolumeManager");
exit(1);
};
//②创建NetlinkManager对象
if(!(nm = NetlinkManager::Instance())) {
SLOGE("Unable to create NetlinkManager");
exit(1);
};
//③创建CommandListener对象
cl = new CommandListener();
vm->setBroadcaster((SocketListener *) cl);
nm->setBroadcaster((SocketListener *) cl);
//④启动VM
if(vm->start()) {
......
exit(1);
}
//⑤根据配置文件来初始化VM
if(process_config(vm)) {
......
}
//⑥启动NM
if(nm->start()) {
......
exit(1);
}
//通过往/sys/block目录下对应的uevent文件写”add\n”来触发内核发送Uevent消息
coldboot("/sys/block");
{
FILE *fp;
char state[255];
/*
Android支持将手机上的外部存储设备作为磁盘挂载到电脑上。下面的代码可查看是否打开了
磁盘挂载功能。这里涉及UMS(Usb Mass Storage,USB大容量存储)方面的知识。
*/
if((fp = fopen("/sys/devices/virtual/switch/usb_mass_storage/state",
"r"))) {
if (fgets(state, sizeof(state), fp)) {
if (!strncmp(state, "online", 6)) {
//⑧VM通过CL向感兴趣的模块(如MountService)通知UMS的状态
vm->notifyUmsConnected(true);
} else {
vm->notifyUmsConnected(false);
}
}
......
fclose(fp);
}
......
}
......
//⑨启动CL
if(cl->startListener()) {
......
exit(1);
}
//无限循环
while(1) {
sleep(1000);
}
SLOGI("Vold exiting");
exit(0);
}
~~~
上面代码中列出了九个关键点。由于Vold将其功能合理分配到了各个模块中,所以这九个关键点将放到图9-1所示Vold的三个模块中去讨论。
下面,看第一个模块NetlinkManager,简称NM。
';