文章目录

前言

简单记录下一下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;
}

主要用途:

  1. 设备热插拔监控:监听 USB 设备、存储设备、网络设备等的插入/移除

  2. 属性变化通知:监听设备属性变化事件

  3. 电源管理事件:监听电源相关事件

  4. Android 系统:Vold 用这个来管理存储卷的挂载/卸载

关键特点:

  1. 大缓冲区:设置 128KB 接收缓冲区,确保能处理大量 uevent 消息

  2. 错误恢复:SO_RCVBUFFORCE失败时回退到 SO_RCVBUF

  3. 安全性:启用 SO_PASSCRED验证消息来源

  4. 多播监听: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()

隐藏内容!
付费阅读后才能查看!
6
8
多个隐藏块只需支付一次

参考文章

  1. AI

  2. Android源码

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...