Android—— 4.2 Vold挂载管理_主体构建main (一)
来源:互联网 发布:美国程序员平均工资 编辑:程序博客网 时间:2024/06/05 15:11
这段时间为了把mmc的一个block当成sdcard内置,学习了下android的vold磁盘挂载模块,记录一下(android 4.2.2)。
撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/38068441
一: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:= voldLOCAL_SRC_FILES := \ main.cpp \ $(common_src_files)LOCAL_C_INCLUDES := $(common_c_includes)LOCAL_CFLAGS := -Werror=formatLOCAL_SHARED_LIBRARIES := $(common_shared_libraries)LOCAL_STATIC_LIBRARIES := libfs_mgrinclude $(BUILD_EXECUTABLE)...
最终会在out 工程目录下的system/bin 下生成一个android可执行文件vold!
关于编译还有个地方需要注意,就是vold机制将会解析的配置文件vold.fstab 这个文件的编译配置在/system/core/rootdir/Android.mk中:
ifeq ($(TARGET_PRODUCT),full)copy_from += etc/vold.fstabendififeq ($(TARGET_PRODUCT),full_x86)copy_from += etc/vold.fstabendififeq ($(TARGET_PRODUCT),full_mips)copy_from += etc/vold.fstabendif
需要需要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 <name> 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 <name> <type> <perm> [ <user> [ <group> ] ] Create a unix domain socket named /dev/socket/<name> and pass its fd to the launched process. <type> 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 和其父类的实例,注册commandvm->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 threadwhile(1) {sleep(1000);}SLOGI("Vold exiting");exit(0);}
VolumeManager 作为Volume的管理类, CommandListener 作为命令注册监听执行相关的类,NetlinkManager 作为接收kernel uevent事件的类
结构大体如下:
Vold的主体结构大体就是这样,往后依次分析各个功能细节以及关联!
- Android—— 4.2 Vold挂载管理_主体构建main (一)
- Android—— 4.2 Vold挂载管理_CommandListener (二)
- Android—— 4.2 Vold挂载管理_VolumeManager (三)
- Android—— 4.2 Vold挂载管理_NetlinkManager (四)
- Android—— 4.2 Vold挂载管理_MountService (六)
- Android—— 4.2 Vold挂载管理_Kernel_USB_Uevent (七)
- Android—— 4.2 Vold挂载管理_DirectVolume/Volume (五)
- Android—— 4.2 Vold挂载管理_mmcblk内置-双sdcard (八)
- vold挂载管理
- vold挂载管理
- Android4.4----Vold挂载管理分析(一)
- Android Vold 分析(一)--system/vold/main.cpp-----mian函数分析
- Android Vold 分析(一)--system/vold/main.cpp-----mian函数分析
- android vold磁盘管理
- Android Vold机制(一)
- android usb挂载分析----vold启动
- android usb挂载分析----vold启动
- android usb挂载分析----vold启动
- C语言拾遗:static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
- poj 1064 二分
- 部署OVF模板失败,提示用户取消任务
- 第二天-运算符,流程控制语句
- 经纬财富:张家界怎么下单才不会做反?
- Android—— 4.2 Vold挂载管理_主体构建main (一)
- 算法之——开平方算法
- cf 371c 二分
- ajax注意点
- qnx resource manager概述
- 关于程序集生成失败 -- 引用的程序集没有强名称的解决办法
- 处理sql server的死锁 [kill spid]
- 陪君醉笑三千场,不诉离殇
- flash遮住了div层怎么办。