9.2.2 初识Vold
下面来认识一下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);
}
上面的代码中列出了8个关键点(即①~⑧)。由于Vold将其功能合理地分配到了各个模块中,所以这8个关键点将放到图9-1所示的Vold的三个模块中去讨论。
下面看第一个模块NetlinkManager,简称NM。