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) {
if (s >= 0) {
把创建的socket fd以环境变量的形式公布出去
publish_socket(si->name, s);
}
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系统核心初始化过程中,如何通过init.c文件中的service_start()函数创建socket,利用环境变量公布socketfd,并由各模块通过android_get_control_socket()函数获取fd进行监听。监听线程在接收到消息后,根据不同消息类型调用相应的处理模块进行解析处理,而内核通过kobject_uevent_env()实现消息写入,供socket读取分析。
5757

被折叠的 条评论
为什么被折叠?



