android vold架构详解(1)

首先上一张整体的结构类图

android vold架构详解(1)

VOLD:Volume Daemon存储守护进程,用来为响应Usb/SD卡插入,拔出等动作提供服务。

系统启动时,通过解析init.rc文件来启动各种系统服务。
包括VOLD服务也是在这里启动。
service vold /system/bin/vold
    class core
    socket vold stream 0660 root mount
    ioprio be 2



VOLD服务的入口函数system/vold/main.cpp
int main() {
    VolumeManager *vm; 	// 管理Volume,实现USB/SD卡Mount,Unmount等动作
    CommandListener *cl; // 传递上层Framework向下发送的信息
    NetlinkManager *nm; // 响应kernel层传递来的VolumeDiskInserted、VolumeDiskRemoved等信息

    mkdir("/dev/block/vold", 0755);

    /* Create our singleton managers */
    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();
    vm->setBroadcaster((SocketListener *) cl);

    // Kernel层消息发送到Library后,经过一些列处理,最后通过这个CommandListener将消息发送到vold Socket中
    // Application Framework层从vold Socket中取得消息,处理。
    nm->setBroadcaster((SocketListener *) cl); 

    if (vm->start()) {  // 什么也没做
        SLOGE("Unable to start VolumeManager (%s)", strerror(errno));
        exit(1);
    }

	// 解析vold.fstab
	// 根据vold.fstab文件,初始化DirectVolume和Volume.cpp实例
    if (process_config(vm)) {   
        SLOGE("Error reading configuration (%s)... continuing anyways", strerror(errno));
    }

	// 初始化NetlinkHandler.cpp实例,开始监听kernel层向上发送的消息
    if (nm->start()) {   
        SLOGE("Unable to start NetlinkManager (%s)", strerror(errno));
        exit(1);
    }

    coldboot("/sys/block");

    /*
     * Now that we're up, we can respond to commands
     */
    // 开始监听来自FrameWork层的信息
    if (cl->startListener()) { 
        SLOGE("Unable to start CommandListener (%s)", strerror(errno));
        exit(1);
    }

    // Eventually we'll become the monitoring thread
    while(1) {
        sleep(1000);
    }

    SLOGI("Vold exiting");
    exit(0);
}


预计明天开始,以下内容分析
Kernel层向上发送消息处理流程
FrameWork层向下发送消息处理流程

你可能感兴趣的:(android)