system/vold/mail.cpp
1、vold初始化,首先会执行main方法,在该方法中,会初始化三个对象,这三个对象是vold的重要组成部分。
VolumeManager *vm; CommandListener *cl; NetlinkManager *nm;
mkdir("/dev/block/vold", 0755);创建三大对象:
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();CommandListener是一个消息传递中介者,其作为服务端,与上层MountService传递消息。故:我们的NetlinkManager与VolumeManager都需要获取其句柄。
vm->setBroadcaster((SocketListener *) cl); nm->setBroadcaster((SocketListener *) cl);2、对象创建完毕,那么接下来就是三大对象的初始化等流程。
2.1、VolumeManager的初始化以及相关逻辑。
if (vm->start()) { SLOGE("Unable to start VolumeManager (%s)", strerror(errno)); exit(1); } if (process_config(vm)) { SLOGE("Error reading configuration (%s)... continuing anyways", strerror(errno)); }2.2、NetlinkManager的初始化以及相关逻辑:
if (nm->start()) { SLOGE("Unable to start NetlinkManager (%s)", strerror(errno)); exit(1); } coldboot("/sys/block");其中coldboot会模拟往设备文件写入内容,从而触发kernel上报底层状态。写入的操作的前提,是保证NetlinkManager与kernel建立链接,从而保证kernel上报的信息,NetlinkManager能够收到并继续处理。
2.3、CommandListener的初始化:
if (cl->startListener()) { SLOGE("Unable to start CommandListener (%s)", strerror(errno)); exit(1); }