文章目录
- 正文
- NetlinkHandler.h
- sysutils/NetlinkListener.h
- libsysutils/NetlinkHandler.cpp
- NetlinkHandler.cpp
- VolumeManager.cpp
- 挂载
- Disk.cpp
- StorageManagerService.java
- Disk.cpp
- VolumeBase.cpp
- PublicVolume.cpp
- StorageManagerService.cpp
- mount()
- VoldNativeService.cpp
- VolumeManager.cpp
- VolumeBase.cpp
- StorageManagerService
- VolumeInfo.java
- 小结
- 参考文章
简单记录下一下Android中插入U盘和卸载U盘的流程,主要是vold层到Framework的流程记录。
记录于此,方便自己查阅和回顾。
正文
主要是自己工作中经常打交道,所以简单的记录一下。
分2篇文章,下面是挂载的流程。
事件分发
NetlinkManager.cpp
/system/vold/NetlinkManager.cpp
start()
int NetlinkManager::start() { struct sockaddr_nl nladdr; int sz = 2 * 64 * 1024; int on = 1; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; nladdr.nl_pid = getpid(); nladdr.nl_groups = 0xffffffff; //创建 Netlink socket if ((mSock = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT)) < 0) { PLOG(ERROR) << "Unable to create uevent socket"; return -1; } //设置接收缓冲区大小 if ((setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) && (setsockopt(mSock, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz)) < 0)) { PLOG(ERROR) << "Unable to set uevent socket SO_RCVBUF/SO_RCVBUFFORCE option"; goto out; } //启用凭据传递 if (setsockopt(mSock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0) { PLOG(ERROR) << "Unable to set uevent socket SO_PASSCRED option"; goto out; } //绑定socket if (bind(mSock, (struct sockaddr*)&nladdr, sizeof(nladdr)) < 0) { PLOG(ERROR) << "Unable to bind uevent socket"; goto out; } //创建NetlinkHandler事件处理器,并启动 mHandler = new NetlinkHandler(mSock); if (mHandler->start()) { PLOG(ERROR) << "Unable to start NetlinkHandler"; goto out; } return 0; out: close(mSock); return -1; }
主要用途:
设备热插拔监控:监听 USB 设备、存储设备、网络设备等的插入/移除
属性变化通知:监听设备属性变化事件
电源管理事件:监听电源相关事件
Android 系统:Vold 用这个来管理存储卷的挂载/卸载
关键特点:
大缓冲区:设置 128KB 接收缓冲区,确保能处理大量 uevent 消息
错误恢复:SO_RCVBUFFORCE失败时回退到 SO_RCVBUF
安全性:启用 SO_PASSCRED验证消息来源
多播监听:0xffffffff表示监听所有 uevent 多播组
NetlinkHandler.h
上面代码引入的是
/system/vold/NetlinkHandler.h
其中有引入sysutils/NetlinkListener.h的头文件,父类为NetlinkListener
sysutils/NetlinkListener.h
/system/core/libsysutils/NetlinkListener.h
下面可以知道父类是SocketListener
#ifndef _NETLINKLISTENER_H #define _NETLINKLISTENER_H #include "SocketListener.h" class NetlinkEvent; class NetlinkListener : public SocketListener { //略 protected: virtual bool onDataAvailable(SocketClient *cli); virtual void onEvent(NetlinkEvent *evt) = 0; }; #endif
这里有两个方法onDataAvailable()和onEvent()
参考文章
AI
