转载请标明出处:http://www.jianshu.com/users/183339cdc7ae/latest_articles
概述
该篇文章主要讲解vold的整体框架和工作流程,不会涉及到具体的实现。具体的实现(从framework到Native再到协议族)会在后面的文章里讲解
Android5.0 vold-启动过程
Android5.0 vold-注册过程(上)
Android5.0 vold-注册过程(下)
什么是Vold
Vold是Volume Daemon的简写,看到daemon就知道这是一个守护进程,那它是干什么的呢?Vold是一个native的程序,用于连接kernel和framework,使他们可以通信。通信的内容包括:SD插拨、挂载、卸载、格式化等。框架如下图
更进一步
这里主要来看看上图中橙色方块中的大体架构
- Vold框架(橙色方块)里面有3个比较重要的组件,分别是:NetlinkManager,VolumeManager,CommandListener.
- NetlinkManager:通过netlink协议接收来自Linux内核uevent消息,并将消息转发给VolumeManager处理
- VolumeManager:把uevent相关信息通过CommandListener发送给MountService,MountService根据收到的消息会发送相应的处理命令给VolumeManager,VolumeManager接收到命令后直接对外部存储设备进行操作。
- CommandListener:内部封装的一个Socket用于跨进程通信,Java层的客户端MountService就是通过该Socket和服务端Vold进行通信的.
- systemServer中最主要的是MountService.可以接受来自Vold的信息,也可以传递信息到Vold(比如:setting中挂载,清楚sd卡)
综上所示,稍微详细一点的框架图如下:
Netlink & Uevent & Socket
上文提到了Netlink & Uevent,那他们是什么呢?
Netlink
Netlink是Linux系统中用户空间进程和Kernel进行通信的一种机制,用户空间进程可以接收来自Kernel的消息,同时也可以向Kernel发送一些控制命令
uevent
uevent和Linux的设备文件系统及设备模型有关,是sysfs向用户空间发送的消息。
消息格式实际上是一串字符串。当外部设备发生变化时,会引起Kernel发送uevent消息
一般设备在/sys对应的目录下有个叫uevent的文件,往该文件里写入指定数据,也会触发Kernel发送和该设备相关的uevent消息,内核通过uevent告知外部存储系统发生的变化。
Socket
这个大家肯定已经耳熟能详了,在这里主要是用于IPC . socket详解