多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
下面来认识一下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。