这段时间为了把mmc的一个block当成sdcard内置,学习了下android的vold磁盘挂载模块,记录一下(android 4.2.2)。

一:Vold的编译及启动

vold的源码位置在android根目录 /system/vold文件下,先看这下面的android.mk:

common_src_files := VolumeManager.cpp CommandListener.cpp VoldCommand.cpp NetlinkManager.cpp NetlinkHandler.cpp Volume.cpp DirectVolume.cpp logwrapper.c Process.cpp Ext4.cpp Fat.cpp Loop.cpp Devmapper.cpp ResponseCode.cpp Xwarp.cpp cryptfs.c

...

LOCAL_MODULE:= vold

LOCAL_SRC_FILES := main.cpp $(common_src_files)

LOCAL_C_INCLUDES := $(common_c_includes)

LOCAL_CFLAGS := -Werror=format

LOCAL_SHARED_LIBRARIES := $(common_shared_libraries)

LOCAL_STATIC_LIBRARIES := libfs_mgr

include $(BUILD_EXECUTABLE)

...

最终会在out  工程目录下的system/bin 下生成一个android可执行文件vold!

关于编译还有个地方需要注意,就是vold机制将会解析的配置文件vold.fstab 这个文件的编译配置在/system/core/rootdir/Android.mk中:

ifeq ($(TARGET_PRODUCT),full)

copy_from += etc/vold.fstab

endif

ifeq ($(TARGET_PRODUCT),full_x86)

copy_from += etc/vold.fstab

endif

ifeq ($(TARGET_PRODUCT),full_mips)

copy_from += etc/vold.fstab

endif

需要需要vold.fstab,或者想添加自己的配置文件,可以在这里添加自己的TARGET_PRODUCT,编译进系统,供vold解析使用。

在/system/core/rootdir/init.rc 中作为服务进程启动,关于init.rc在android启动的作用可参考Android——启动过程详析

service vold /system/bin/vold

class core

socket vold stream 0660 root mount

ioprio be 2

关于init.rc的语法规则可参考/system/core/init/readme.txt,其中:

class

Specify a class name for the service. All services in a

named class may be started or stopped together. A service

is in the class "default" if one is not specified via the

class option.

...

socket [ [ ] ]

Create a unix domain socket named /dev/socket/ and pass

its fd to the launched process. must be "dgram", "stream" or "seqpacket".

User and group default to 0.

二:Vold入口

在上面通过init启动这个守护进程,入口为/system/vold/main.cpp中的main函数:

int main() {

VolumeManager *vm;

CommandListener *cl;

NetlinkManager *nm;

SLOGI("Vold 2.1 (the revenge) firing up");

mkdir("/dev/block/vold", 0755);//存放设备节点

/* Create our singleton managers */

if (!(vm = VolumeManager::Instance())) {

SLOGE("Unable to create VolumeManager");

exit(1);

};

if (!(nm = NetlinkManager::Instance())) {

SLOGE("Unable to create NetlinkManager");

exit(1);

};

cl = new CommandListener(); //构造 commandlistener 和其父类的实例,注册command

vm->setBroadcaster((SocketListener *) cl);

nm->setBroadcaster((SocketListener *) cl);

//设置VolumeManager NetlinkManager 这两个实例里面 一个发送广播的变量,通过隐式转换,变量类型为指向 SocketListener类的指针

if (vm->start()) {//没实际操作

SLOGE("Unable to start VolumeManager (%s)", strerror(errno));

exit(1);

}

//解析上面说到过的 vold.fstab 这样的配置文件,然后将解析到的内容新建抽象类(DirectVolume)的实例,然后保存到VolumeManager 中的一个容器中,后备使用

if (process_config(vm)) {

SLOGE("Error reading configuration (%s)... continuing anyways", strerror(errno));

}

if (nm->start()) {//创建用于接收kernel的socket,实例化NetlinkHandler以及父类实例,开启socket检测

SLOGE("Unable to start NetlinkManager (%s)", strerror(errno));

exit(1);

}

coldboot("/sys/block");//遍历所有设备信息,全部发送一个add 的uevent

// coldboot("/sys/class/switch");

/*

* Now that we're up, we can respond to commands

*/

if (cl->startListener()) {//开启vold 的socket以及检测

SLOGE("Unable to start CommandListener (%s)", strerror(errno));

exit(1);

}

// Eventually we'll become the monitoring thread

while(1) {

sleep(1000);

}

SLOGI("Vold exiting");

exit(0);

}

VolumeManager 作为Volume的管理类, CommandListener 作为命令注册监听执行相关的类,NetlinkManager 作为接收kernel uevent事件的类

Vold的主体结构大体就是这样,往后依次分析各个功能细节以及关联!

原文:http://blog.csdn.net/jscese/article/details/38068441

android vold 挂载读写,Android——Vold磁盘挂载_主体构建(一)相关推荐

  1. oracle 磁盘挂载格式化,Linux简单磁盘挂载

    临时挂载: 1.fdisk /dev/sda ---磁盘名根据实际情况 2.n --添加新分区,linux要求最多四个主分区,最少一个主分区,最多一个扩展分区,所以一般设置为三个主分区和一个扩展分区, ...

  2. 深度linux 挂载硬盘,Deepin 深度磁盘挂载

    Deepin 磁盘挂载 看到我的终端式英文不用惊奇,我也不知道怎么会这样,但是这也不影响我们要做的事情. 1. 查看当前磁盘情况 使用 df -h 查看磁盘情况 Filesystem Size Use ...

  3. 磁盘挂载、ECS数据盘挂载、云服务器磁盘挂载

    阿里云ECS数据盘挂载 1.查看硬盘及分区信息 fdisk -l 2.分区: fdisk /dev/vdbn p 1 enter enter wq 4.再次查看硬盘及分区信息 fdisk -l 5.格 ...

  4. android 监控app 读写,Android端 APP性能监控实践

    如今大部分的APP测试工作关注点主要集中在功能的逻辑与交互上,由于各种原因(比如测试时间不够,测试手段有限等等),对APP客户端的性能数据往往比较忽视,然而经过移动互联网爆发式发展后,许多App功能差 ...

  5. 取消挂载点可以节省磁盘么_磁盘克隆、磁盘镜像还有复制粘贴有什么不一样?...

    最近在倒腾新SSD和用了三四年的老操作系统,期间在磁盘上创建个新的分区,并且安装了一个全新的Windows10,结果,一不小心覆盖了老系统的引导,系统丢了.然后,用各种引导工具进行了修复,好在几次有惊 ...

  6. linux磁盘永久挂载教程,linux 永久磁盘挂载

    包年包月实例过期后,如果未在规定时间内续费,实例和磁盘均会自动释放,数据永久丢失,无法找回.关于预付费资源过期后的状态变化,请参考 预付费(包年包月). 在使用包年包月实例过程中,如果您觉得当前实例配 ...

  7. android 文件并发读写,Android下,rxJava+retrofit 并发上传文件和串行上传文件的效率为什么差不多?...

    有个功能需要同时上传N个文件.代码如下: ApiService as = ApiManager.getApiService(); final ExecutorService es = Executor ...

  8. android ble 连续读写,Android BLE实现对蓝牙的读写

    [实例简介] 通过修改官方的demo实现对蓝牙的读写操作,详细http://blog.csdn.net/chenfengdejuanlian/article/details/45787123 [实例截 ...

  9. android 本地文件读写,Android 读写文件方法汇总

    一. 从resource中的raw文件夹中获取文件并读取数据(资源文件只能读不能写) String res = ""; try{ InputStream in = getResou ...

最新文章

  1. FreeSWITCH配置文件详解
  2. 小白如何学习大数据开发,大数据学习路线是怎样的?
  3. java开发环境搭建--写给java新手
  4. 【课题总结】OpenCV 抠图项目实战(6)色彩范围抠图
  5. 网络基础---IP编址
  6. Struts2标签库常用标签
  7. python经纬度获取县名_利用 Python 批量获取县镇运输距离
  8. java 获取数据源_J2EE java 获取数据源
  9. JAVA:基础递归算法大杂烩
  10. 逻辑SQL Server数据复制101
  11. uva 10817 - Headmaster's Headache ( 状态压缩dp)
  12. POJ 2079 求最大三角形面积
  13. Android9 更改系统默认输入法
  14. 败家女提供QQ伤感日志_喜欢1个人听着忧伤的歌
  15. 使用Aircrack-ng工具破解WEP、WPA/WPA2加密的无线网络
  16. Kotlin全套视频教程分享
  17. 基于UE4 的AirSim虚拟仿真
  18. 人工智能基础 | K近邻(三)
  19. 第6章 面向对象的程序设计
  20. java中怎么esc事件监听_Javascript监听 ESC按下事件

热门文章

  1. 13、基于51单片机防火防盗烟雾温度人体红外感应检测设计(程序+原理图+PCB图+Proteus仿真+参考论文+开题报告+元器件清单等)
  2. 2018年2月英语学习总结
  3. [Win 7]原来的桌面属性那里去了?个性化里选壁纸,改主题,显桌面图标
  4. codeforces 274A. k-Multiple Free Set【二分】
  5. C++ 运算符重载和类型转换函数
  6. IPOD 的使用方法
  7. iCheck如何获得id与value
  8. 基于Django和翻译API实现web版的中英文对照翻译(一)
  9. (volar)修饰符不能出现在此处。ts
  10. Wannafly挑战赛5之可编程拖拉机比赛