Android Vold初步学习经历

vold进程是干什么的

vold进程:基本功能是Android 平台用来监控外部存储设备的。比如说usb 插拔,挂在 卸载 等。
它也是通信的一部分,即它是接收来自内核消息的通知,转换成 FW的通知,告诉java测(MountService)

vold的启动流程

vold 首先自己是一个进程, 所以它也可以包含service 和client
1 首先从main函数查看
void main
解析配置文件(process_config)
…,
Android fstab file.
<mnt_point> <mnt_flags and options> <fs_mgr_flags>
The filesystem that contains the filesystem checker binary (typically /system) cannot
specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK

/devices/soc0/soc/2100000.aips-bus/2198000.usdhc/mmc_host* auto auto defaults voldmanaged=sdcard:auto,encryptable=userdata
/devices/soc0/soc/2100000.aips-bus/2184000.usb/ci_hdrc.0* auto auto defaults voldmanaged=usb:auto
/dev/block/by-name/system /system ext4 ro,barrier=1 wait,verify=/dev/block/by-name/metadata
/dev/block/by-name/userdata /data ext4 nosuid,nodev,nodiratime,noatime,nomblk_io_submit,noauto_da_alloc,errors=panic wait,formattable,encryptable=/dev/block/by-name/datafooter
/dev/block/by-name/cache /cache ext4 nosuid,nodev,nomblk_io_submit wait
/dev/block/by-name/device /device ext4 ro,nosuid,nodev wait
/dev/block/by-name/boot /boot emmc defaults defaults
/dev/block/by-name/recovery /recovery emmc defaults defaults
/dev/block/by-name/misc /misc emmc defaults defaults
/dev/block/by-name/bootloader /bootloader emmc defaults defaults
/dev/block/zram0 none swap defaults zramsize=314572800

devices/soc0/soc/2100000.aips-bus/2190000.usdhc/mmc_host* /mnt/sdcard1 auto defaults voldmanaged=sdcard:auto,encryptable=userdata

int main() {
……
process_config
CommandListener *cl;
cl = new CommandListener();
vm->setBroadcaster((SocketListener *) cl);
nm->setBroadcaster((SocketListener *) cl);
//启动CommandListener监听
cl->startListener();
}

vold 如何和内核通信

说道vold 和内核通信,就不得不说NetlinkManager 这个模块, 但是说NetlinkManager 模块的时候
又得说SocketListenner 功能。
所以 先说下SocketListenner。
1 SocketListenner 是socket通信的监听者。 它通过成员变量mListern 来判断SocketListenner是service端还是 client端。
如果是和内核通信,那么SocketListenner 的成员变量mListern 为false。继承SocketListenner的派生类NetlinkManager,就是客户端。(接收内核消息使用的是udp协议)
也就是说,派生类NetlinkManager是和Kernel通信的客户端
2 前面说到了vold 既要和Kernel通信,又要和java层通信(MountService)那么SocketListenner 的派生类CommandListener 就是和MountService通信。SocketListenner这个类的成员变量 mListern 为true。
这个时候 CommandListener 是服务端,接收客户端MountService的绑定

时序图

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值