这段时间一直在研究内置SD卡和外置SD卡的挂载问题,看了网上jecese关于Android4.2的Vold挂载的博客后,结合自己在Android4.4上做的一些实验,记录下来,以便日后查阅!
一:Vold的启动
关于vold的源码在jb4.4-kikat/system/vold/,根据Android.mk可以知道编译后会生成一个可执行文件vold,并安装到system/bin下。而这个vold会作为一个服务在系统启动的时候去启动它!
在init.rc中
service vold /system/bin/vold
class core
socket vold stream 0660 root mount //vold启动的时候创建socket
ioprio be 2 //这个不是很明白
vold的入口为/system/vold/main.cpp中的main函数
int main() {
VolumeManager *vm;//这个类主要是接收经NetlinkManager类处理过的消息进行挂载动作
CommandListener *cl;
NetlinkManager *nm;//这个类主要通过NetlinkHandler类中的onEvent()方法接收来自kernel发过来的事件信息
SLOGI("Vold 2.1 (the revenge) firing up");
mkdir("/dev/block/vold", 0755);//创建/dev/block/vold/存放设备节点
/* For when cryptfs checks and mounts an encrypted filesystem */
klog_set_level(6);
/* 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);
nm->setBroadcaster((SocketListener *) cl);
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));
}
if (nm->start()) {//创建接收来自kernel信息的socket,实例化NetlinkHandler类,并开启socket检测
SLOGE("Unable to start NetlinkManager (%s)", strerror(errno));
exit(1);
}
coldboot("/sys/block");//遍历/sys/block下全部的设备信息,并发送一个add事件
// coldboot("/sys/class/switch");
/*
* Now that we're up, we can respond to commands
*/