Android—— 4.2 Vold挂载管理_VolumeManager (三)

Android—— 4.2 Vold挂载管理_主体构建main (一)中分析了大体的框架,这里分析一下核心VolumeManager,再次补上结构框架图如下:

可以看到VolumeManager就是整个Android 磁盘挂载Vold机制的核心调度,上下连接的中转站!

我从Vold main代码的顺序结构来一次分析,上一篇Android—— 4.2 Vold挂载管理_CommandListener (二)  中分析了与framework层交互的CommandListener的功能作用

这里分析VolumeManager在整个体系中所扮演的角色和职能!

撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/38581521

一:VolumeManager 初始构建:

依旧在/system/vold/main.cpp中:

    /* Create our singleton managers */
    if (!(vm = VolumeManager::Instance())) {
        SLOGE("Unable to create VolumeManager");
        exit(1);
    };

    ...

    if (vm->start()) {
        SLOGE("Unable to start VolumeManager (%s)", strerror(errno));
        exit(1);
    }

    if (process_config(vm)) {
        SLOGE("Error reading configuration (%s)... continuing anyways", strerror(errno));
    }

先看同级目录的VolumeManager.cpp 的构造函数:

VolumeManager::VolumeManager() {
    mDebug = false;
    mVolumes = new VolumeCollection();//卷的一个容器
    mActiveContainers = new AsecIdCollection();//活动容器,mount/unmount asec obb时的记录
    mBroadcaster = NULL;//指向SocketListener,用于发送挂载事件
    mUmsSharingCount = 0;
    mSavedDirtyRatio = -1;
    // set dirty ratio to 0 when UMS is active
    mUmsDirtyRatio = 0;
    mVolManagerDisabled = 0;
}

其中最为重要的就是mVolumes这个容器:

typedef android::List<Volume *> VolumeCollection;

是/system/vold/Volume.cpp的实例集合!

vm->start()没有任何操作!

二:process_config

这个函数用于解析指定的配置文件,根据内容构造DirectVolume以及父类然后保存进VolumeManager的容器中,供VolumeManager用于挂载事件的管理。

static int process_config(VolumeManager *vm) {
    FILE *fp;
    int n = 0;
    char line[255];

    if (!(fp = fopen("/etc/vold.fstab", "r"))) {  //打开配置文件/etc/vold.fstab
        return -1;
    }

    while(fgets(line, sizeof(line), fp)) {
        const char *delim = " \t";//\t之前有个空格,以空格或者水平制表符(tab)来用来分割读出来的line

        if (!(type = strtok_r(line, delim, &save_ptr))) {//分割读到的line string,一次获取规定顺寻的参数,使用的是线程安全函数strtok_r

            SLOGE("Error parsing type");
            goto out_syntax;
        }
        if (!(label = strtok_r(NULL, delim, &save_ptr))) {
            SLOGE("Error parsing label");
            goto out_syntax;
        }
        if (!(mount_point = strtok_r(NULL, delim, &save_ptr))) {
            SLOGE("Error parsing mount point");
            goto out_syntax;
        }
        if (!strcmp(type, "dev_mount")) {
            DirectVolume *dv = NULL;
            char *part;

            if (!(part = strtok_r(NULL, delim, &save_ptr))) {
                SLOGE("Error parsing partition");
                goto out_syntax;
            }
            if (strcmp(part, "auto") && atoi(part) == 0) {
                SLOGE("Partition must either be 'auto' or 1 based index instead of '%s'", part);
                goto out_syntax;
            }

            if (!strcmp(part, "auto")) { //根据上面解析到的值构建 DirectVolume实例
                dv = new DirectVolume(vm, label, mount_point, -1);
            } else {
                dv = new DirectVolume(vm, label, mount_point, atoi(part));
            }

            while ((sysfs_path = strtok_r(NULL, delim, &save_ptr)))

...

            vm->addVolume(dv);//添加进VolumeManager的容器

...
    }
}

可以看VolumeManager中的addVolume函数:

int VolumeManager::addVolume(Volume *v) {
    mVolumes->push_back(v);
    return 0;
}

继承关系 DirectVolume ——> Volume,这里强制转换了

三:vold.fstab

这个配置文件的编译在Android—— 4.2 Vold挂载管理_主体构建main (一)中有详细分析,先看看这个配置文件的注释:

#######################
## Regular device mount
##
## Format: dev_mount <label> <mount_point> <part> <sysfs_path1...>
## label        - Label for the volume
## mount_point  - Where the volume will be mounted
## part         - Partition # (1 based), or 'auto' for first usable partition.
## <sysfs_path> - List of sysfs paths to source devices
######################

每一行对应上面的五个参数,各个参数之间以空格或者tab分开,google有个例子:

dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1

这是挂载sdcard的配置,前面的几个分别对应上面注释中的,最后的sysfs_path 就是要挂载的源设备路径,这个根据各自的平台修改(我的是/dev/block/platform/*),第一个不行就会用第二个

VolumeManager的功能实现函数(mountVolume,handleBlockEvent等),都是受到其它功能模块调用,如上面的主体框架图,

这里不做解析,在后面的DirectVolume/Volume挂载,以及NetlinkEvent事件处理中会分析。

Android—— 4.2 Vold挂载管理_VolumeManager (三)

时间: 2024-10-08 10:54:45

Android—— 4.2 Vold挂载管理_VolumeManager (三)的相关文章

Android—— 4.2 Vold挂载管理_NetlinkManager (四)

在前文Android-- 4.2 Vold挂载管理_主体构建main (一)中有结构图表示,Vold是kernel与用户层的一个交互管理模块, Android-- 4.2 Vold挂载管理_VolumeManager (三)简单介绍了核心VolumeManager的构建,这篇分析从kernel进程沟通到VolumeManager进程的关键:NetlinkManager 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/3858602

Android—— 4.2 Vold挂载管理_mmcblk内置-双sdcard (八)

Vold的学习过了一段时间了,才想着把mmcblock内置成sdcard的方法记录一下. 当初就是因为要做这个功能才去学习Vold机制,贴出之前的博客: Android-- 4.2 Vold挂载管理_主体构建main (一) Android-- 4.2 Vold挂载管理_CommandListener (二) Android-- 4.2 Vold挂载管理_VolumeManager (三) Android-- 4.2 Vold挂载管理_NetlinkManager (四) Android-- 4

Android—— 4.2 Vold挂载管理_DirectVolume/Volume (五)

在前文Android-- 4.2 Vold挂载管理_VolumeManager (三) 中解析了VolumeManager是怎么样抽取Volume实例以及DirectVolume与Volume之间的关系,在上篇Android-- 4.2 Vold挂载管理_NetlinkManager (四)中从kernel开始调用到handleBlockEvent,这里解析一下Vold挂载的真正操作,也就是Volume的操作! 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/a

Android—— 4.2 Vold挂载管理_MountService (六)

整个Vold机制应该算system层,与framwork层的交互在Android-- 4.2 Vold挂载管理_CommandListener (二)中有提到过,是通过一个"vold"的socket进行通信的,这里分析一下framework中负责与Vold通信的:MountService 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/38978387 一.MountService启动: 在/frameworks/bas

Android—— 4.2 Vold挂载管理_CommandListener (二)

在前一篇博客中介绍了个大体结构 Android-- 4.2 Vold挂载管理_主体构建 (一),按照代码的顺序结构来依次分析,这里来看看CommandListener这个类做了什么. 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/38434263 一:CommandListener构造 在/system/vold/main.cpp的main函数中构建实例: cl = new CommandListener(); vm->setB

Android—— 4.2 Vold挂载管理_Kernel_USB_Uevent (七)

在前文Android-- 4.2 Vold挂载管理_NetlinkManager (四)中有解析到Vold 是从kernel中获取uevent事件,来获取device信息,其中是通过一个Netlink的套接字,目前整个Vold机制也分析完了, 上篇 Android-- 4.2 Vold挂载管理_MountService (六) 分析了机制中最上层的,这里分析一下最下层的kernel uevent事件的发送,以USB设备为例! 撰写不易,转载请注明出处:http://blog.csdn.net/j

Android线程管理(三)——Thread类的内部原理、休眠及唤醒

线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用.本小节主要从以下三个方面进行分析: <Android线程管理(一)——线程通信> < Android线程管理(二)——ActivityThread > < Android线程管理(三)——Thread类的内部原理.休眠及唤醒 > 三.Thread类的内部原理.休眠及唤醒 3

Android(Xamarin)之旅(三)

原文:Android(Xamarin)之旅(三) 前面两篇说到了Xamarin的安装和一些简单的控件,今天来说说一些对话框和提示信息,以及简单的布局元素. 一.对话框和提示信息 一.对话框 我们首先从简单的对话框开始. 1.普通对话框 在android里面,对话框用的是AlertDialog,这个呢,其实就和winform里面的MessageBox一样的.最简单的 AlertDialog.Builder ad_build = new AlertDialog.Builder(this) .SetT

Android 4.4(KitKat)窗口管理子系统 - 体系框架

窗口管理系统是Android中的主要子系统之一,它涉及到App中组件的管理,系统和应用窗口的管理和绘制等工作.由于其涉及模块众多,且与用户体验密切相关,所以它也是Android当中最为复杂的子系统之一.一个App从启动到主窗口显示出来,需要App,ActivityManagerService(AMS),WindowManagerService(WMS),SurfaceFlinger(SF)等几个模块相互合作.App负责业务逻辑,绘制自己的视图:AMS管理组件.进程信息和Activity的堆栈及状