Android USB\HDMI等事件监听

来源:互联网 发布:java就业培训班 编辑:程序博客网 时间:2024/05/20 01:47
1,在system/core/init/init.c中service_start()中
          创建socket:
          int s = create_socket(si->name, socket_type, si->perm, si->uid, si->gid);
            if (s >= 0) {
                把创建的socket fd以环境变量的形式公布出去
                publish_socket(si->name, s);
            }

          ANDROID_SOCKET_"name"=fd

2,在system/core/include/cutils/sockets.h中
static inline int android_get_control_socket(const char *name)来根据环境变量获取前面创建的 fd

3, 由各模块调用上面的函数获取fd, 进行监听(这里以NetlinkHander为例,主要是监听USB,BATTERY,POWER,HDMI等事件)
NetlinkHandler::start()---->SocktLintener::startListener()---->android_get_control_socket().
紧接着创建一个新的纯种进行监听,SocketListener::threadStart()---->SocketListener::runListener();

4, 上面的监听线程会在收到消息后,如果不是新的设备监听请求,则调用onDataAvailable(),实际上就是NetlinkListener::onDataAvailable()--->NetlinkHandler::onEvent(),然后根据消息类型送到不同的处理模块解析处理;

5, 内核中则由lib/kobject_uevent.c中的kobject_uevent_env()实现写入消息,供上面建立的socket读取并进行分析。
原创粉丝点击