Vold(volume Daemon),即Volume守护进程,用来管理Android中存储类的热拔插事件,处于Kernel和Framework之间,是两个层级连接的桥梁。先来看一下Vold在Android系统的整体架构。
该图主要包含了Framework和Vold进程的,Kernel和App层涉及的内容这里不再涉及,简单介绍一下。Vold主要是接收Kernel的uevent消息,然后通过NM(NetLinkManager)和VM(VolumeManager)处理,将消息传递到Framework的SM(StorageManager),最后SM会将数据存储下来,消息通知到在SM注册的服务和App。
Vold在系统中以守护进程存在,是一个单独的进程,首先来看下Vold的启动过程以及如何与Kernel和Framework建立的联系。
在init.rc中有start vold的命令会被init解析到,而start对应的函数do_start(const BuiltinArguments& args);即启动对应的service,对应vold.rc文件如下。
service vold /system/bin/vold \
--blkid_context=u:r:blkid:s0 --blkid_untrusted_context=u:r:blkid_untrusted:s0 \
--fsck_context=u:r:fsck:s0 --fsck_untrusted_context=u:r:fsck_untrusted:s0
class core
ioprio be 2
writepid /dev/cpuset/foreground/tasks
shutdown critical
group root reserved_disk
接下来看一下vold的main函数(由于篇幅原因,只列出来部分主要过程),简要概括为以下几个过程:
- 初始化Log函数;
- 解析rc中的参数,创建vold块设备节点;
- 获取NM和VM单例对象;
- 启动NM、VoldNativeService和VM;
- 创建线程池,并进入循环,维持进程不退出;
int main(int argc, char** argv) {
android::base::InitLogging(argv, android::base::LogdLogger(android::base::SYSTEM)); //初始化Log类
VolumeManager* vm;
NetlinkManager* nm;
parse_args(argc, argv);//解析参数
mkdir("/dev/block/vold", 0755);//创建vold节点,用来接收uevent消息;
if (!(vm = VolumeManager::Instance())) {
LOG(ERROR) << "Unable to create VolumeManager";
exit(1);
}
if (!(nm = NetlinkManager::Instance())) {
LOG(ERROR) << "Unable to create NetlinkManager";
exit(1)