Vold学习笔记

本文主要参考学习了老邓的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即为挂载使用的可执行文件。

03-25
<think>好的,我现在需要解决用户关于“vold android service”的问题。首先,用户提到的vold在Android中的作用,我需要先回忆一下相关知识。 根据提供的引用资料,vold是Volume Daemon,负责管理存储设备的热插拔事件,连接内核和框架层。引用[5]提到vold的代码路径是system/vold和/system/core/libsysutils/src,这可能涉及它的实现结构。用户可能想知道vold服务是如何启动的,或者它的工作原理。 接下来,我需要检查用户给出的引用内容。例如,引用[3]提到vold在init.rc中作为服务进程启动,而init.rc在Android启动过程中有重要作用。这可能涉及vold的启动机制,由init进程启动,作为守护进程运行。 然后,用户的问题可能包括vold的功能、架构或与其他组件的交互。引用[4]说明vold管理U盘等存储设备,不同Android版本可能有差异。需要指出vold处理设备挂载、卸载,与Framework层的MountService通信。 用户提供的引用中有多个链接,但部分链接可能重复或不可访问,但根据引用内容,我需要整合这些信息,确保回答准确。例如,引用[1]和[2]都提到vold的架构和启动参数,可能需要解释其服务配置。 可能的疑问点:vold作为守护进程,如何监听内核事件?答案可能涉及Netlink套接字,用于接收内核的uevent,如引用[5]提到的处理热插拔事件。 此外,用户的问题可能涉及vold的调试或常见问题,比如存储设备无法识别,可能需要检查vold的日志或配置。不过用户当前的问题更偏向于基本功能和工作原理,所以重点应放在解释vold的角色、架构和流程上。 需要确保回答结构清晰,分点说明vold的定义、架构、工作流程、启动方式等,并引用提供的资料作为支持。同时,生成的相关问题应围绕vold的扩展知识,如与其他服务交互、调试方法、版本差异等。</think>### Android Vold 服务解析 #### 1. Vold 的定义与作用 **Vold**(Volume Daemon)是 Android 系统中负责**存储设备热插拔管理**的核心守护进程,充当**内核层与框架层之间的桥梁**。它监听来自 Linux 内核的存储设备事件(如 U 盘插入、SD 卡挂载),并通过与上层服务(如 `MountService`)通信完成设备的挂载、卸载、格式化等操作[^5]。 #### 2. Vold 的架构与组件 - **代码路径**: - 主要逻辑:`system/vold` - 基础工具库:`/system/core/libsysutils/src`[^5] - **核心模块**: - `VolumeManager`:管理存储设备生命周期 - `NetlinkManager`:通过 Netlink 套接字监听内核的 `uevent` 事件 - `CommandListener`:处理来自上层服务的指令(如 `mount`、`unmount`) #### 3. Vold 的工作流程 1. **事件监听**: Vold 通过 Netlink 接收内核发出的 `uevent`(如 `add`/`remove` 设备事件)[^5]。 2. **设备处理**: - 解析设备类型(如 U 盘、SD 卡) - 调用 `fsck` 检查文件系统完整性 3. **与上层通信**: - 通过 `Binder` 将事件通知 `MountService` - 执行来自 `MountService` 的指令(如格式化存储设备)[^4]。 #### 4. Vold 的启动方式 Vold 由 **init 进程**在系统启动时通过 `init.rc` 脚本启动,配置示例如下: ```rc service vold /system/bin/vold class core socket vold stream 0660 root mount ioprio be 2 ``` - 关键配置: - 以 `core` 类核心服务运行 - 创建名为 `vold` 的 Unix 域套接字用于进程通信[^3][^2]。 #### 5. 与其他组件的关系 - **内核层**:通过 `uevent` 获取存储设备状态变化 - **Framework 层**:通过 `Binder` 与 `MountService` 交互 - **文件系统**:调用 `mount`/`umount` 等系统调用完成实际操作[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值