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

Android—— 4.2 Vold挂载管理_VolumeManager (三)_第1张图片

可以看到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事件处理中会分析。






更多相关文章

  1. C语言函数以及函数的使用
  2. android电子书App、自定义图表、仿腾讯漫画App、仿淘宝优惠券、3
  3. H5 Web网页通过JS(JavaScript)脚本调用Android本地原生方法函数
  4. android 回调函数二:应用实例
  5. Android界面布局——视图/容器易混淆点总结
  6. [android]android的容器、控件
  7. android NDK JNI设置自己的log输出函数
  8. Android build/envsetup.sh 脚本分析(lunch函数)
  9. Android Hook学习之ptrace函数的使用

随机推荐

  1. Wifi广播状态
  2. adb下载
  3. Android(安卓)解码MediaCodec 播放H264 2
  4. Android文件存储
  5. Android(安卓)结束进程的方法
  6. Android(安卓)NDK Development ---- Andr
  7. Android的NDK开发(2)————利用Android
  8. android surfaceflinger boot
  9. 解决activity加上Theme.Translucent.NoTi
  10. Android(安卓)支持 Java8