Android5.0 vold-整体架构

1,002 阅读3分钟

概述

该篇文章主要讲解vold的整体框架和工作流程,不会涉及到具体的实现。
具体的实现(从framework到Native再到协议族)会在如下的后续文章里提及。
Android5.0 vold-启动过程
Android5.0 vold-注册过程(上)
Android5.0 vold-注册过程(下)

什么是Vold

Vold是Volume Daemon的简写。
直译过来Volume可以翻译为卷,是电脑中磁盘的概念,对应到手机上就是相关存储介质
看到Daemon字样就知道这是一个守护进程,那它有什么作用呢?
首先它是一个native程序,用于连接kernel和framework(SystemServer进程),使他们可以通信。通信的内容包括:SD插拨、挂载、卸载、格式化等。
框架如下图

arch.png

更进一步

既然主要是讲vold,那就先来看看vold的内部组成

  1. Vold框架(橙色方块)
    里面有3个比较重要的组件,分别是:NetlinkManagerVolumeManagerCommandListener.
    • NetlinkManager:通过netlink协议接收来自Linux内核uevent消息,并将消息转发给VolumeManager处理
    • VolumeManager:把uevent相关信息通过CommandListener发送给SystemServer进程,该进程中的MountService根据收到的消息会发送相应的处理命令给VolumeManager,VolumeManager接收到命令后直接对外部存储设备进行操作。
    • CommandListener:内部封装的一个Socket用于跨进程通信,Java层的客户端MountService就是通过该Socket和服务端Vold进行通信的.
  2. systemServer中最主要的是MountService.可以接受来自Vold的信息,也可以传递信息到Vold(比如:setting中挂载, 清除sd卡等)
    综上所诉,稍微详细一点的框架图如下:
    detal_arch.jpeg

总结

vold的整体架构已经主要组成部分的功能就介绍完了,这里故意没有涉及到任何代码,主要目的就是得首先头脑里得有个大致的框架,知道某个组件的作用,从哪里接受信息,要把信息传递到哪里去,这样才不至于在后续的代码讲解中lost

More

上文提到了Netlink & Uevent & Socket,那他们是什么呢?

Netlink是Linux系统中用户空间进程和Kernel进行通信的一种机制,用户空间进程可以接收来自Kernel的消息,同时也可以向Kernel发送一些控制命令

uevent

uevent和Linux的设备文件系统及设备模型有关,是sysfs向用户空间发送的消息。
消息格式实际上是一串字符串。当外部设备发生变化时,会引起Kernel发送uevent消息
一般设备在/sys对应的目录下有个叫uevent的文件,往该文件里写入指定数据,也会触发Kernel发送和该设备相关的uevent消息,内核通过uevent告知外部存储系统发生的变化。

Socket

这个大家肯定已经耳熟能详了,在这里主要是用于vold和systemserver的IPC .
关于socket的使用可以点击 Unix Socket