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。