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);
}