原生安卓 vold 流程及框架

前言:    由于谷歌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

 

 

 

 

 

 

参考:

Android存储系统之架构篇

Android 7.0 Vold工作流程

Android9.0版本Vold服务源码分析之上层处理SD卡挂载

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值