🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Netd进程的入口函数是其main函数,代码如下所示: **main.cpp** ~~~ int main() { CommandListener *cl; NetlinkManager *nm; DnsProxyListener *dpl; MDnsSdListener *mdnsl; ALOGI("Netd 1.0 starting"); //为Netd进程屏蔽SIGPIPE信号 blockSigpipe(); //①创建NetlinkManager nm = NetlinkManager::Instance(); //②创建CommandListener,它将创建名为"netd"的监听socket cl = new CommandListener(); //设置NetlinkManager的消息发送者(Broadcaster)为CommandListener。 nm->setBroadcaster((SocketListener *) cl); //启动NetlinkManager nm->start(); ...... //注意下面这行代码,它为本Netd设置环境变量ANDROID_DNS_MODE为"local",其作用将在2.2.4节介绍 setenv("ANDROID_DNS_MODE", "local", 1); //③创建DnsProxyListener,它将创建名为"dnsproxyd"的监听socket dpl = new DnsProxyListener(); dpl->startListener(); //④创建MDnsSdListener并启动监听,它将创建名为"mdns"的监听socket mdnsl = new MDnsSdListener(); mdnsl->startListener(); cl->startListener(); while(1) { sleep(1000); } exit(0); } ~~~ Netd的main函数非常简单,主要是创建几个重要成员并启动相应的工作,这几个重要成员分别是: - NetlinkManager:它将接收并处理来自Kernel的UEvent消息。这些消息经NetlinkManager解析后将借助它的Broadcaster(也就是代码中为NetlinkManager设置的CommandListener)发送给Framework层的NetworkManagementService。 - CommandListener、DnsProxyListener、MDnsSdListener:分别创建名为"netd"、"dnsproxyd"、"mdns"的监听socket,并处理来客户端的命令。 下面将分别讨论这四位成员的作用。