Android(安卓)USB\HDMI等事件监听
16lz
2021-01-25
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读取并进行分析。
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读取并进行分析。
更多相关文章
- (转帖)Android系列之Message机制的灵活应用
- Eclipse配置Android开发环境
- 【android】fragment不响应onActivityResult的问题
- android 编译学习
- 如何单独编译Android源代码中的模块
- Android聊天软件开发(基于网易云IM即时通讯)——发送图片消息(五)
- PC安卓模拟器PANIC: Could not open:C:\Documents and Settings
- Android: 如何利用Handler处理和发送消息来实现页面刷新的功能
- android 2.2数据连接过程