Vold初识1

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


你可能感兴趣的:(vold)