Android4.4_DNS流程

拿getByName举例。
framework端:
InetAddress.getByName ->
    getAllByNameImpl ->
        lookupHostByName ->
            Libcore.os.getaddrinfo ->    //调用natvie函数
                getaddrinfo ->    //bionic\libc\netbsd\net\getaddrinfo.c
                    android_getaddrinfoforiface ->
                        android_getaddrinfo_proxy -> //这里cache_mode为空,netd设置的ANDROID_DNS_MODE环境变量只在进程中有效。
                            connect    //这里的socket name是/dev/socket/dnsproxyd,也就是通过dnsproxd来和netd dameon进程交互。

                            fprintf    //往dnsproxyd写getaddrinfo命令,接下来就交由netd进程处理。


netd端:
new DnsProxyListener ->    //system/netd/main.cpp
dpl->startListener ->
    pthread_create ->
        SocketListener::threadStart ->
            me->runListener ->
                select
                accept
                onDataAvailable ->  //FrameworkListener.cpp 客户端写消息到socket dnsproxyd中,dnsproxyd是在FrameworkListener中注册。
                    dispatchCommand ->
                        runCommand ->
                            DnsProxyListener::GetAddrInfoCmd::runCommand ->
                                new DnsProxyListener::GetAddrInfoHandler
                                handler->start ->
                                    DnsProxyListener::GetAddrInfoHandler::start ->
                                        DnsProxyListener::GetAddrInfoHandler::threadStart ->    //DnsProxyListener.cpp netd初始化后会启动dnsProxyListener线程监听/dev/socket/dnsproxd来的消息。
                                            handler->run ->
                                                DnsProxyListener::GetAddrInfoHandler::run ->
                                                    android_getaddrinfoforiface  -> //这里不会跑android_getaddrinfo_proxy了,因为此时的ANDROID_DNS_MODE值是local了,所以直接获取dns地址。
                                                        explore_fqdn ->
                                                            nsdispatch ->
                                                                _files_getaddrinfo    //从文件/system/etc/hosts获取
                                                                _dns_getaddrinfo    //或者从dns服务器获取        

                                                    sendLenAndData    //发回给framework端~

参考:

dns:
http://blog.csdn.net/span76/article/details/49449741
http://blog.csdn.net/span76/article/details/41478555
http://blog.csdn.net/insswer/article/details/17382535
nsdispatch
http://www.freebsd.org/cgi/man.cgi?query=nsdispatch

你可能感兴趣的:(Android4.4_DNS流程)