Vold学习笔记

转载 2015年07月08日 17:40:25

本文主要参考学习了老邓的Vold章节。

平台:android4.0
场景:客户要求系统默认对NTFS的SD卡支持识别。
时间:2012.7.28

Android系统默认支持FAT文件系统,不支持NTFS,EXFAT。其原因不在于技术方面,而是版权。
在全志的平台上,以上文件系统都是支持的。所以在做分析时,也参考了全志平台的做法。

vold是Volume Daemon的简称,其是用于管理和控制android平台外部存储设备的后台进程,相关代码在system/vold下面。
1.vold使用socket的进行跨进程通信。其中重要的几个文件分别为:NetlinkManager.cpp,
VolumeManager.cpp,
CommandListener.cpp,
Volume.cpp。
在框架中,其对应的是MountService,此为框架中存储设备挂载的核心类。其通过socket与CL通信,为Client端,其监听CL传上来的kernel消息(设备挂载,移除等),并向CL发送命令,从而控制vold进行mount,unmount等操作。

2.关于Uevent。它实际上就是一串字符串。
在vold中,kernel上报的uevent中封装了DEVPATH信息等,DEVPATH信息在后面被用来比对对应的挂载设备,从而区分设备,进行操作。
设备一般在/sys对应的目录下存在一个event文件。当往文件中写入指定的数据,也会触发kernel发送和该设备相关的Uevent消息。
Vold启动时,就使用这种方式,进而触发kernel发送Uevent消息,使得vold能够得到相关的设备信息。

3.NetlinkHandler继承与SocketListener。其中的onDataAvailable()函数,在收到数据时被调用。NetlinkHandler被多线程使用,其根据kernel上报的Uevent进行相应的处理。
if (!strcmp(subsys, “block”)) {
vm->handleBlockEvent(evt);
} else if (!strcmp(subsys, “switch”)) {
vm->handleSwitchEvent(evt);
} else if (!strcmp(subsys, “battery”)) {
} else if (!strcmp(subsys, “power_supply”)) {
}
此处,便于VolumeManager有了联系。

4.VolumeManager即为挂载设备管理者。每一个挂载上来的设备,对应一个volume对象。
在vold的main()函数中,有一个调用process_config(vm),其为解析system/etc/vold.fstab文件,每一个dev_mount解析出来,构造一个DirectVolume对象,其继承与Volume。
在process_config()中,会调用dv->addPath()方法,将DV对象和其DEVPATH进行绑定,即为后面的对比调用做好了准备。其最后会调用vm->addVolume(dv),将vold.fstab中申明的dev_mount都加入到VM的mVolumes变量中,以供后面的handleBlockEvent()的调用。

5.CommandListener继承于SocketListener,其为socket的service端。接收Client(即mountservice)发送来的命令,调用相应的runCommand()进行处理。

6.当一个SD卡设备插入时:
(1).NetlinkHandler收到kernel上报的Uevent,并调用vm->handleBlockEvent(evt);
(2).Vm::handleBlockEvent()中,
会遍历通过process_config()扩充的变量mVolumes,进行每个对象的DV::handleBlockEvent()方法的调用;
(3).DV::handleBlockEvent()===>DV::handleDiskAdded(),通过VM中的CL对象进行socket通信,通知mountservice;
(4).mountservice::onEvent()===>doMountVolume()===>mConnector.doCommand(String.format(“volume mount %s”, path));
(5).CommandListener::VolumeCmd::runCommand===>vm->mountVolume(argv[2])===>通过挂载路径比对出对应的volume对象===>v->mountVol();
(6).Volume中,Fat::check()===>Fat::doMount(),从而调用到Fat.cpp中的domount()函数进行挂载,最后通过setState()方法,将结果通过CL返回给mountservice,mountservice随即发出ACTION_MEDIA_MOUNTED广播。

解决方法:
(1).修改Volume .cpp。在mountVol()中
ret = Fat::doMount(devicePath, getMountpoint(), false, false, 1000, 1015, 0002, true);
if ((ret != 0) && (ret != EROFS)) {
SLOGE(“%s failed to mount via VFAT (%s)\n”, devicePath, strerror(errno));
//add by fox 2012.7.28
if(Ntfs::doMount(devicePath, getMountpoint(), false, 1000)){
SLOGE(“%s failed to mount via NTFS (%s)\n”, devicePath, strerror(errno));
setState(Volume::State_Idle);
return -1;
}
//end
(2).添加Ntfs.cpp和Ntfs.h文件。其中关键的部分是,挂载NTFS使用的是第三方的可执行文件,此文件需要添加到system/bin目录下。
static char NTFS_3G_PATH[] = “/system/bin/ntfs-3g”。ntfs-3g即为挂载使用的可执行文件。

相关文章推荐

Android 7.0 Vold工作流程

Vold是Volume Daemon的缩写,它是Android平台中外部存储系统的管控中心,是管理和控制Android平台外部存储设备的后台进程。其功能主要包括:SD卡的插拔事件检测、SD卡挂载、卸载...

ANDROID中的VOLD分析

    现在可能很少有人会用mknod这个命令了,也很少有使用它的机会,但就在几年前,这还是一项linux工程师的必备技能,在制作文件系统前或加载新的驱动前,我们必须小心翼翼的创建设备节点。 不需要...

Android6.0 MountService和vold详解(三) vold SD卡、otg

既上面两篇博客,继续分析vold、对外置SD卡和OTG的分析: 一、process_config函数 上一篇我们再main函数中分析了VolumeManager的start函数,这次我们接下来分析...

CyanogenMod 10 修改 Vold 使 Android 自动挂载 NTFS 和 exFAT 格式的 SD 卡

Android 不支持 NTFS 和 exFAT 格式的文件系统,但是 Linux 已经有相应的开源代码了,因此只需将其移植到 Android 上即可。 这里需要下载两份代码,分别是 ntfs-3g...

Android vold系统分析

熟悉操作系统的都知道,硬件存储设备如何才能被系统的软件操作,需要将设备节点挂载至相应的挂载点(目录),挂载的时候会有一系列的参数,包括挂载为什么格式的文件系统等,然后标准的文件系统操作就可以控制硬件存...

Android Vold 架构简析

李力琼 (joni.kartorz.lee@gmail.com)软件工程师,热爱并致力于Linux平台的开源软件的开发,你可以用email与他联系。本文中Andorid系统的版本为4.3及以上。 --...
  • kartorz
  • kartorz
  • 2016年06月01日 10:48
  • 2539

Vold工作流程分析学习

一 Vold工作机制分析          vold进程:管理和控制Android平台外部存储设备,包括SD插拨、挂载、卸载、格式化等;          vold进程接收来自内核的外部设...

Vold工作流程分析学习

from: http://www.cnblogs.com/bastard/archive/2012/12/03/2799298.html 一 Vold工作机制分析          v...

Selenium API 学习笔记(XMIND版)

  • 2017年11月20日 10:56
  • 1.1MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Vold学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)