2021-01-20
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的绑定
时序图
本文地址:https://blog.csdn.net/weixin_48886724/article/details/112845831
推荐阅读