/system/vold/
在分析一个项目时,首要看项目根目录的Android.mk,
这个会可以看清楚项目最终生成的东西和项目大概结构功能。
libvold 静态库
============================================
Asec.h
获得的知识点:
1.使用#define 作为struct定义字段的值,相当于规定了子段值的取值范围,对于使用者是一个很好的说明
CheckBattery.cpp
这里其实就是调用电池属性服务去获得当前电量的百分比
is_battery_ok_to_start() 电量大于等于10%
is_battery_ok_to_continue() 电量大于等于5%
获得的知识点:
1.以最简单的方式demo出使用c/c++ binder 服务的客户端代码,在整个android源代码里都是充满了这种调用方式,好处就是服务与组件之间的解耦,也是android的核心所在
如果要调用本地系统服务的函数,这就是最好的例子,简单易懂
2.简单描叙binder调用过程
2.1 defaultServiceManager 获得以注册的服务用例
2.2 利用interface_cast 强制转换相应服务的对应接口用例
2.3正常调用接口相应的函数,就像调用本地函数一样
CommandListener.cpp
这里定义实现了google提供的一个方便访问调用有名称的socket框架库,其实原理很简单,就是读写vold socket操作,只不过使用这个可以规范代码,减少代码重复量和沉余
为什么不使用像binder这样高级的调用框架?
答:使用linux传统socket来实现程序间的数据通讯
1.实现相对简单,就是普通的socket操作
2.可以与java层应用进行通讯,应为java 也有对应的socket访问函数调用
3.应用程序之间交流的数据量小,适宜采用这种方式沟通,基本流程就是 发送cmd->socket->相关服务获取cmd-> 发送cmd->socket-> 调用者获取结果(注:过程中产生的数据量是很少的,通常都是几个字符的大小量)
定义的命令和实现如下:
AsecCmd
其实就是VolumeManager类的方法调用,想知道具体功能查看这个类的实现
CryptfsCmd
加密相关的操作,详情看cryptfs.c
DumpCmd
打印相关调式信息
FstrimCmd
文件系统缩减操作,详情看fstrim.c
ObbCmd
obb就是大文件的访问,好像游戏应用,安装一个小的apk外壳,然后指定一个大的obb文件的路径进行加载,效果就像apk本地使用资源一样,有效的可以把大的资源文件分开
详情看VolumeManager类的实现
StorageCmd
磁盘挂载和获取所有用户信息
VolumeCmd
卷轴相关操作
详情看VolumeManager类的实现
可以看得出这个地方其实就是处理发送命令的地方入口,可以把相关结果返回调用方。实现可以是外部项目和内部项目的引入。
获得的知识点:
1. 示范google提供的socket框架库的使用样板
2.所有命令相关的参数要求可以在这里查询
cryptfs.c
获得的知识点:
1.通常头文件里定义的东西都是对外公开的,实现文件定义的都是内部使用的
例如方法
void functionA(){} 可以对外的
static functionB(){} 内部使用的
2.命名规则
例如文件cryptfs.c
里面对外的函数命名为cryptfs_xxxxxxx()
我想这个库的主角应该是VolumeManager这个类,详情的我也不细说了,应为涉及的东西很多
只要知道这个库是更存储管理相关的就可以了,如果有机会有相关项目做的,会深入了解
============================================
vold linux应用程序(守护进程)
main.cpp + libvold 静态库
所以这里只讨论main.cpp
工作流程
创建libvold 静态库提供的VolumeManager和NetlinkManager类并启动相关函数
解释外部文件/fstab.xxx信息
冷启动/sys/block,其实/sys是能与linux内核沟通和控制的地方,它比/proc更高级,现在/proc只用来获取apps的相关信息片,大部分工作都由/sys来做
冷启动/sys/block其实就是要控制linxu底层硬件相关的操作,系统文件系统等东西,它的操作也很简单,就是在所有uevent文件里加个add\n, 然后利用递归的方法遍历所有文件
看起来是不是很不可思议,这样就能与底层打交道了。其实这个东西已由我们伟大的驱动程序来做的,所以在理解linux系统时,记得一个原则,“一切都是文件,读写就是这么简单”
进入无限循环是程序变成守护进程
获得的知识点:
1.在C语言的static修饰的方法你可以当做是java类的private函数一样功能
2.一切都是文件,读写就是这么简单,这就是linux世界
3.理解卷轴文件的结构信息fstab.xxxx
总结:
vold就是libvold 静态库入口的地方
============================================
vdc linux应用程序
打开vold命名的socket文件
命令参数为<monitor>
使用系统函数select轮询监测vold socket文件的写入变化,
如有变化就从中读取文件里的数据并打印在终端上显示
命令参数为 [arg1] [arg2...]
使用write系统函数对socket文件写入相方规定好的命令字符
然后使用命令参数为<monitor>的方式去显示结果数据
也就说vdc linux应用程序其实是一个测试工具来的,使用它输入相关命令,然后就显示数据结果
获得知识点:
1.linux main函数下的argv[0]是程序名称的值
2.cutils库下的socket封装相关工具函数的使用,不过这个socket是根据名称查找建立的,这是android特有的socket,和传统的socket是有一定区别
3.系统函数select的使用,主要就是监测文件的变化而触发相关动作事件
4.使用系统io函数read读取socket结果,write写入命令