前言: 由于谷歌AndroidContainers 中将Vold中的某些模块和代码进行了重写,通过mojom借道chromiumOS间接和内核进行通讯和操作,所以我们需要研究原生安卓中的vold的流程以作参考。为我们分析和实现AC中的vold理清思路。
Vold是Volume Daemon的缩写,它是Android平台中外部存储系统的管控中心,是管理和控制Android平台外部存储设备的后台进程。其功能主要包括:SD卡的插拔事件检测、SD卡挂载、卸载、格式化等。
模块架构:
(此框架基于Android7.0 在9.0中与上层的通信方式有更改)
- Kernel:通过uevent向Vold的NetlinkManager发送Uevent事件;
- NetlinkManager:接收来自Kernel的Uevent事件,再转发给VolumeManager;
- VolumeManager:接收来自NetlinkManager的事件,再转发给CommandListener进行处理;
- CommandListener:接收来自VolumeManager的事件,通过socket/binder通信方式发送给MountService;
- MountService:接收来自CommandListener的事件。
如上图所示,在原生安卓中kernel将上报uevent事件让上层处理,但是在AndroidContainer中这一块的通信和调用方式被volumemount mojom取代,volumemount会将内核和chromiumOS这边发生的mountevent发送到安卓的Vold中。而Volumemanage在原生安卓中进行的系统调用进行挂载的操作也被arc-setup 服务和appfuse obbmounter 这些mojom替换了。arc-setup在chromiumOS这里准备好了各种挂载的目录在mount-bind给安卓,供安卓使用。安卓vold中要使用的appfue和obb相关的挂载都是通过mojom在chromiumOS端实现载mount-bind进安卓供其使用。
进程架构:
- Java层:采用 1个主线程(system_server) + 3个子线程(VoldConnector, MountService, CryptdConnector);
- Native层:采用 1个主线程(/system/bin/vold) + 3个子线程(vold) + 1子进程(/system/bin/sdcard);
原生安卓中sdcard是由volumemanager 通过fork
方式创建的,而其他子线程都是通过pthread_create
方式创建的,用于挂载download文件夹。在AndroidContainer中则是通过arc-setup在chromiumOS进行相关目录的挂载在VolumeManager中调用ArcVolumeManager中的arcMountSdcard来进行mount-bind 绑定到对应目录的。
- MS: MountService.java
- NDC: NativeDaemonConnector.java
- SL: SocketListener.cpp
- FL: FrameworkListener.cpp
- CL: CommandListener.cpp
- SC: SocketClient.cpp
- VM: VolumeManager
参考: