Android——Vold磁盘挂载_主体构建(一)

这段时间为了把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:= 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 <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 和其父类的实例,注册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的主体结构大体就是这样,往后依次分析各个功能细节以及关联!

Android——Vold磁盘挂载_主体构建(一),布布扣,bubuko.com

时间: 2024-08-03 10:51:38

Android——Vold磁盘挂载_主体构建(一)的相关文章

Linux_常用命令_03_磁盘/挂载_信息查看

1. 1.1. mount 不带参数的话,显示的是 当前已经挂载的情况 1.2. df 不带参数的话,硬盘分区状况查询 2. 2.1. cat /proc/partitions 2.2. fdisk -l 2.3. 3. 3.1.ubuntu 的相关显示信息: [email protected]:~# fdisk -l Disk /dev/sda: 128.8 GB, 128849018880 bytes 255 heads, 63 sectors/track, 15665 cylinders,

android全磁盘加密

android 全磁盘加密 什么是全磁盘加密? 全磁盘加密是使用一个密钥来为android设备上所有的用户数据加密的过程.一旦设备被加密,所有的用户创建的数据都将会在提交的磁盘之前自动加密,在读取之前都会自动解密. Android 5.0中添加了啥 创建了快速加密,该加密方式仅仅加密在数据分区中使用块设备的数据来避免第一次启动耗费较长时间.仅仅ext4和f2fs文件系统支持快速加密. 在首次启动的时候添加forceencrypt标志来加密 增加了对模式的支持和没有密码的加密 增加使用可信执行环境

Android -- Vold机制简要分析

Android -- Vold机制简要分析 Vold是用于管理和控制Android外部存储介质的后台进程,这里说的管控,主要包括SDK的插拔.挂载/卸载和格式化等:它是Android平台外部存储系统的管控枢纽. Vold的整个控制模块主要由三个类模块构成:NetlinkManager.VolumeManager和CommandListener,它们的功能划分大概是: NetlinkManager:用于从kernel中获取SD卡插拔的Uevnet消息 VolumeManager:管理模块,对Net

三周第五次课(12月29日) 4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间

三周第五次课(12月29日)4.5/4.6 磁盘格式化4.7/4.8 磁盘挂载4.9 手动增加swap空间 [[email protected] ~]# [[email protected] ~]# mke2fs命令文件系统管理mke2fs命令被用于创建磁盘分区上的"etc2/etc3"文件系统. 语法:mke2fs(选项)(参数) 选项:-b<区块大小>:指定区块大小,单位为字节:-c:检查是否有损坏的区块:-f<不连续区段大小>:指定不连续区段的大小,单位为

Android Studio官方文档之构建和运行你的APP

Android Studio官方文档之构建和运行你的APP 本文由MTJH翻译,jkYishon审校. 前言 默认情况下,Android Studio设置新的项目并且部署到模拟器或者真机设备上,只需要点击几下.使用即时运行,你并不需要构建一个新的APK即可将改变后的方法和现有的应用资源应用到一个正在运行的应用程序中,所以代码的改变是即时可见的. 点击Run来构建并运行你的APP.Android Studio通过Gradle构建你的App,选择一个部署的设备(模拟器或连接的设备),然后把你的APP

android内部培训视频_第五节(1)_OA实战之登录界面

第五节(1):OA实战之登录界面  一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent&q

4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间

4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间 4.5/4.6 磁盘格式化 磁盘格式化 上 根/  和 /boot 都是  xfs centos6 之前的版本 文件格式系统ext4 6 是ext5 5 是 ext 3 再往前 ext 2 centos 7 默认 是 xfs   作为它的默认文件系统 fdisk -l 查看下 之前的分区 没有分,先分一个新的分区 现在给他格式化 mke2fs mke2fs -t 指定格式化的文件系统 比如要指定ext4 mke2

Ubuntu将新增磁盘挂载到home下

home磁盘空间不足,其他闲置硬盘是原来windows的,不能直接使用(磁盘格式及权限等原因),比如编译安卓源码等. 这样的话就需要将新的磁盘格式化成fat32后挂载到/home下的一个目录,这样就可以方便使用啦. 具体步骤如下: 1.格式化磁盘: a.使用命令: sudo mkfs -t ext3 /dev/sdb1 如果执行后开始出现进度就是正在执行,需要等待,是需要时间的. 最后显示如下: Java代码 mke2fs 1.41.14 (22-Dec-2010) Filesystem lab

使用 Android 客户端向 Ruby on rails 构建的 Web Application 提交 HTTP GET 和 HTTP POST 请求

最近想弄个能访问 Internet 的 Android 应用,因为求快所以用了 Ruby on Rails 来提供 HTTP 资源.这方面的资料还是比较少的,所以把尝试的过程记录下来. 1 使用 Ruby on Rails 构建 Web Application 1.1 新建 Web Application rails new Test cd Test 1.2 生成 product rails generate scaffold product reference:string quantity: