Android5.0 vold-整体架构

转载请标明出处: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插拨、挂载、卸载、格式化等。框架如下图


Android5.0 vold-整体架构_第1张图片
arch.png

更进一步

这里主要来看看上图中橙色方块中的大体架构

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

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详解

你可能感兴趣的:(Android5.0 vold-整体架构)