作者:gzshun. 原创作品,转载请标明出处!
来源:http://blog.csdn.net/gzshun
写了好几篇文章,花儿都快谢了,终于轮到Framework发挥领导的身份了,Framework作为界面与vold之间的桥梁,用户是Framework的大爷,那么Framework就是Vold的大哥大,Framework发出一个命令,Vold不敢不遵从,只能照着Framework的意思照办,千万不能出差错,不然Android就要丢大脸了,登不上三国争霸的舞台,iOS VS Android VS WP7?
在Framework里面,有一个目录是用来存放一些Java的系统服务,这些都在后台跑着,在:/android-2.2r2/frameworks/base/services/java/com/android/server目录下,比较重要的是这两个源文件:MountService.java和NativeDaemonConnector.java。
这里先列出在Vold中,VolumeCmd类处理的一些磁盘操作命令,这些命令均是有Framework下发的:
1.volume list:Framework先得到系统目前存在几个Volume对象,需要获取到这些对象的标签;
2.volume debug:设置USB调试模式
3.volume mount sdcard:挂载SD卡
4.volume unmount force:卸载SD卡
5.volume format sdcard:格式化SD卡
6.volume share sdcard ums:开启SD卡的OTG功能(大容量存储),也就是连接电脑
7.volume unshare sdcard ums:关闭SD卡的OTG功能(大容量存储)
8.volume shared sdcard ums:获取目前OTG的开启状态,就是是否连接电脑的状态。
以下分别列出每个命令的下发函数,对Java不熟,但看得懂程序的流程,真是惭愧啊。
一、Framework磁盘管理服务的开启?
在NativeDaemonConnector服务里面,开始监听底层Vold发送过来的磁盘热插拔事件的状态信息,当收到底层广播上来的状态,调用MountService服务中的onDaemonConnected函数进行处理,当然这是开机第一次去获取信息的,也就是下发"volume list"命令。
以上两个比较重要的函数在MountService当中,处理相当多的内容,源码太长。
下发volume list命令,Framework收到反馈值,将调用onDaemonConnected函数获取到了磁盘的标签,挂载点与状态,然后调用doGetShareMethodAvailable函数判断现在是否连接OTG,若连接OTG,那么调用doShareUnshareVolume函数下发otg连接命令(volume share sdcard ums)。
二、Vold与Framework如何通信?
onEvent主要是处理状态信息的解析,将每一种状态进行判断,并调用相应的操作函数。比如此时vold发送一个VolumeDiskInserted状态,意味着系统插入一个磁盘,于是onEvent就调用doMountVolume挂载函数进行下发命令(volume mount sdcard)。
在系统使用当中,用户可能会插入,移除,挂载,卸载,格式化磁盘,那么这儿多状态如何告诉Framework呢?之前已经说过,vold使用了setState函数来广播磁盘的状态消息,使得Framework能够及时地判断下发什么命令与操作。该函数在Volume.cpp源文件中,先贴出setState源码看看:
可以看到,setState函数将磁盘的label,mountpoint,oldstate,statestr,newstate,statestr消息通知给Framework,这样Framework就知道vold中SD卡的新旧状态。然后调用通过SocketListener类继承下来的sendBroadcast函数广播消息,反馈码是ResponseCode::VolumeStateChange,代表状态改变的消息。
这里可能有个疑问,vold广播这么多消息,Framework是如何分清哪条消息是代表哪一类的反馈消息呢?
广播消息在开头使用了ResponseCode类提供的一些状态反馈码,每一类消息都用一个反馈码,这样Framework的MountService服务能够很快的判断出类型。之前的文章说过了,这里列出几个重要的反馈码:
setState函数只负责磁盘状态改变的广播,其他插入磁盘或者移除磁盘的都是直接调用sendBroadcast函数来广播,这里贴出插拔事件的广播函数:
三、下发操作命令?
volume mount sdcard:
volume unmount force:
volume format sdcard:
volume share sdcard ums
volume unshare sdcard ums:
volume shared sdcard ums:
在Framework中的磁盘管理部分,也涉及到很多代码,源码太多,只贴出比较重要的功能模块代码。
四、UI的处理
从vold走到了Framework,最后一层就是UI,是用户操作磁盘的界面。有Android手机的哥们儿都知道,在设置里面可以挂载,卸载与格式化SD卡。当然这图形界面不是咱擅长的,需要Java的功底与XML,那边主要就是界面的实现。
UI的源码路径是:/android-2.2r2/packages/apps/Settings/src/com/android/settings/deviceinfo/Memory.java
我们可以发现,在Android手机的设置界面,或者主页面,只要插入SD卡或者移除SD卡,都会有相应的提示,
1.这些磁盘状态是如何与UI通信的呢?
在MountService服务中,每次改变状态,都会调用updatePublicVolumeState函数,从意思上看,可以理解成:更新一个公用的磁盘状态。这个函数就是起到了这么一个作用,这会设置到Environment类中的一个变量中,这样UI就能够取到磁盘的状态。
2.UI是如何调用Framework中的函数的?
前面有提到过,UI想要调用Framework中的MountService服务中的函数,比如以注册的方式来得到调用操作磁盘函数的权限。以下贴出UI中,Memory.java源码中注册MountService磁盘操作函数的方法:
来看一个挂载SD卡的操作函数,就知道如何来调用Framework系统服务的函数:
3.UI获取SD卡的当前状态
在第一点已经解释过了,这里再仔细的说明下:
SD卡的状态是这样获取到的:
Vold (setState)-->
MountService (onEvent)-->
MountService (updatePublicVolumeState)-->
UI (getExternalStorageState)
Vold调用setState函数广播SD卡的状态,Framework的MountService服务通过onEvent函数收到该状态消息,调用updatePublicVolumeState函数设置到Environment中的一个变量中,UI再通过Environment.getExternalStorageState函数获取到最新状态,于是UI调用updateMemoryStatus函数将最新状态设置到界面,这样用户就能看到状态的改变。
(用户都会发现,挂载或卸载SD卡,状态由挂载变为卸载需要一小段时间,这中间就是经过这些处理来得到的,包括上层发送命令->底层解析命令调用相应函数->操作完成后发送操作结果->最后将SD卡的最新状态广播给Framework,并设置到UI。这中间涉及到很多东西,再加上Java虚拟机的速度,于是界面就有一个停顿的时间)。
以下贴出UI状态的更新代码:
五、好聚好散
终于将Android系统磁盘管理的这部分给over了,现在我深深地敬佩系统设计人员,他们都是非凡的人才,再次感谢谷歌对Android社区的贡献。先不说谷歌有没有对Android的开源,或者一些专利的事,但在我眼里,Google是非常强大的公司,向他学习,没错的。
三争IT天下: Google VS Microsoft VS Apple.
三分智能领域:Android VS WP7 VS iOS.
分享到:
相关推荐
vold不仅体现了Android在设备管理方面的灵活性和高效性,也展示了其模块化设计的思想,即通过松耦合的组件和高效的通信机制,构建出一个既强大又灵活的移动操作系统。对于想要深入了解Android系统内部工作原理的...
在Android系统中,`vold`(Volume Daemon)是一个至关重要的服务,它负责管理设备的存储空间,包括内部存储和外部存储(如SD卡)。`vold`在系统启动时运行,提供对文件系统的挂载、卸载以及权限管理等功能。通过对`...
5. MTP(Media Transfer Protocol)与PTP(Picture Transfer Protocol)支持:Vold为Android设备提供了MTP和PTP协议,使得用户可以通过电脑或其他设备以媒体设备的方式进行数据交换。 三、Vold的运行机制 Vold服务...
Vold服务通过socket机制与底层驱动通信,同时通过JNI、intent、socket和doCommand等方式与Android框架进行交互。 2. **流程概览** - **开启服务**:在Android系统启动时,Vold服务会自动启动。它会在/dev/block...
Vold与Framework层之间的通信主要通过socket实现。具体来说,Vold通过Netlink协议接收内核发送的uevent事件,这些事件会被转换成特定的命令,然后通过socket传递给Framework层。Framework层可以通过这个socket向Vold...
在Android 系统中所有的热插拔设备都是通过Vold 进程挂载的。通过kernel–>vold–>StorageManagerService这样的架构去逐级上报热插拔事件。 一、Vold 入口 --> /system/vold/main.c int main(int argc, char** ...
vold不仅是一个简单的守护进程,它通过一套复杂的内部架构和通信机制来实现其功能,是Android外部存储管理不可或缺的一部分。了解vold的工作原理和架构对于开发人员来说是非常有价值的,尤其是在进行存储相关的开发...
通过上述架构,Vold能够高效地完成对外部存储设备的管理任务,确保Android设备在面对不同的存储介质时能够保持良好的兼容性和稳定性。 ### 结论 Vold作为Android系统中不可或缺的一部分,在移动设备存储管理方面...
Vold与Android Framework层之间通过socket进行通信。Framework层可以通过特定的命令接口与Vold交互,例如请求挂载或卸载存储设备。这种交互方式使得Vold能够灵活地响应Framework层的需求,同时也简化了Framework层对...
总结来说,Vold模块是Android系统中负责管理外部存储设备的核心组件,它利用udev的机制和NetLink通信机制,与Framework层的MountService和StorageManager进行交互,以确保外部存储设备能够被有效地管理和使用。...
VOLD启动后会创建一个socket,与framework层通信。其内部架构的主要步骤包括创建连接、引导和事件处理。VOLD能够处理的事件包括设备插入、弹出、设备权限变更、文件系统检测、媒体扫描等。 在Android的存储管理框架...
6. **用户界面集成**:为了让用户能够方便地访问和管理这些额外的挂载点,可能还需要更新Android的文件管理器应用或其他相关的UI组件。 在提供的补丁文件`4.4_mid_多u盘多分区挂载补丁`中,我们可以看到具体的代码...
Vold进程是Android系统中管理和控制外部存储设备的核心组件之一。它接收来自内核的外部设备消息,用于管理和控制Android平台外部存储设备,包括SD插拨、挂载、卸载、格式化等。 Vold进程框架设计主要由三个模块组成...
在深入探讨Android系统中Vold的基本原理及其与USB相关的实现细节之前,我们先来简要回顾一下Vold的背景和重要性。Vold(Volume Daemon)是Android操作系统中一个重要的组件,负责管理外部存储设备如USB存储和SD卡等...
USB之android_Vold分析,分析了linux udev与android vold的关系由来,vold的功能、架构,使用netlink的通信过程。kernel的uevent发送,framework层的处理、磁盘的挂载等等。
- **开启Vold服务**:在Android系统启动时,Vold服务会被初始化,它会在`/dev/block`下创建`vold`目录,并启动`VolumeManager`、`NetlinkManager`和`CommandListener`。 - **引导Uevent**:`NetlinkManager`监听...
Vold(Volume Daemon)是Android系统中负责管理和控制平台外部存储设备(例如SD卡)的后台进程。Vold机制确保了Android系统能够有效地监测和响应外部存储设备的事件,如SD卡的插入和拔除,同时处理设备的挂载、卸载...
android平台移植ntfs-3g使支持ntfs格式tf卡、U盘、stat硬盘挂载,解压文件到external目录下,mm编译成功后,可手动指行 ntfs-3g /dev/block/vold/* /storage/sdcard1 或者添加 Ntfs.cpp Ntfs.h到system/vold目录实现...