<Android开发> Android vold - 第一篇 vold前言简介

本系列主要介绍 Android vold,分为以下篇章
<Android开发> Android vold - 第一篇 vold前言简介
<Android开发> Android vold - 第二篇 vold 的main()函数简介
<Android开发> Android vold - 第三篇 vold 的NetLinkManager类简介

本次主要讲解存储模块如U盘等设备在android设备中的管理和使用的模块。本次主要基于android 8.1版本进行解析。不同android版本 vold的内容可能会有所差异。读者可对比阅读解析。

1 Vold介绍
Android中Vold是volume Daemon,即Volume守护进程;Android没有使用Linux平台下的udev来处理磁盘,于是Google写了一个类似udev功能的vold,充当了kernel与framework之间的桥梁;作为Android的一个本地服务,负责处理诸如SD、USB等存储类设备的插拔等事件。

  1. 手机usb以MTP或者传输照片方式插拔PC端后磁盘数据的挂卸载;
  2. 设备开关机过程中存储设备各分区的挂卸载;
  3. TF卡插拔识别过程中文件系统挂卸载。
    在各场景做mount过程中,涉及到的磁盘数据的安全加密(FDE/FBE),文件节点与目录的创建,文件系统的垃圾清理等模块,也由Vold进行控制。

2 Vold架构
Vold在系统中以守护进程存在,是一个单独的进程,下一节会介绍Vold的启动流程。处于Kernel和Framework之间,是两个层级连接的桥梁。下图是Vold在Android系统的整体架构。
<Android开发> Android vold - 第一篇 vold前言简介_第1张图片

Vold主要是接收Kernel的uevent消息,然后NetLinkManager将消息放在NetLinkHandler队列送到VolumeManager,最终将消息传递到Framework的StorageManager。最后StorageManager会将数据存储下来,消息通知到在StorageManager注册的service与应用。

3 vold启动流程
Vold在系统中以守护进程存在,所以在android启动时调用init.rc会去启动。
以下以android 8.1为例对具体源码说明。
android的init.rc启动vold的调用如下:
路径:LINUX/android/system/core/rootdir/init.rc

<Android开发> Android vold - 第一篇 vold前言简介_第2张图片

在Android 系统启动的时候,init进程会去解析init.rc文件,在init.rc中有start vold的命令会被init解析到,而start对应的函数do_start(constBuiltinArguments& args);即启动对应的service,service再解析vold.rc 文件 对Vold做一些初始化配置。

vold.rc 文件路径内容入下:
路径:LINUX/android/system/vold/vold.rc
<Android开发> Android vold - 第一篇 vold前言简介_第3张图片

在rc文件调用启动vold进程服务后,最先运行的当然是main()函数了。接下来看看vold 服务的main函数。
现在做个相关涉及的方法类的了解;
首先,kernel监测到U盘等存储设备,会产生一个uevent事件。
而vold 服务内有一个NetlinkManager类,该类会建立一个socket,来监测所有的uevent事件最后会new一个NetlinkHandler对象,并执行start函数。然后调用NetlinkListener父类的startListener函数去监听event。
vold服务还有另外一个VolumeManager类,对Framework或kernel传来的消息处理,kernel的uevent需要通过NetlinkManager类,然后给到VolumeManager类。Framework的数据则是通过CommandListener类,再给到VolumeManager类。
VolumeManager类,主要负责收发与Framework通信的数据。所以整个Vold涉及的大类包括VolumeManager、CommandListener、NetlinkHandler;其中每个类由继承了其它的父类。后续讲解每一个部分都会详细介绍。
知道了涉及的这类方法/类之后,我们就来看看具体的代码内容吧。

你可能感兴趣的:(Android,Vold,android,linux)