解说==/system/vold/

/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写入命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值