Android网络DNS

1 Android netd DNS
libcore/ojluni/src/main/java/java/net/InetAddress.java
netd中dns server设置文件:ResolverController.cpp
netd中域名解析文件:DnsProxyListener.cpp

Figure 1-1 Android netd DNS

Android网络DNS_第1张图片

2 libc DNS解析函数
bionic/libc/dns/net/getaddrinfo.c
getaddrinfo()
bionic/libc/dns/net/getnameinfo.c
getnameinfo()
bionic/libc/dns/net/gethnamaddr.c
gethostbyname()

通过netd获取DNS服务器的IP地址(Ubuntu通过进程dnsmasq和配置文件/etc/resolv.conf),然后构建DNS请求包,查询域名对应的IP地址,并且按照netId的分类缓存到netd中:
bionic/libc/dns/net/gethnamaddr.c
gethostbyname_internal_real()

3 Android netId
3.1 获取网络接口的netId
netd中将接口名(wlan0、eth0等)转化为netId的函数:
server/NetworkController.cpp
NetworkController::getNetworkForInterface(const char* interface)

3.2 代码示例
server/CommandListener.cpp
函数CommandListener::NetworkCommand::runCommand()的最后添加如下的代码:
//       0             1               2
// network query_netid if_name
if (!strcmp(argv[1], "query_netid")) {
    if (argc < 3) {
        return syntaxError(client, "Missing argument");
    }
    int _netId = gCtls->netCtrl.getNetworkForInterface(argv[2]);
    char msg[16] = {0};
    int retval = snprintf(msg, 15, "%d", _netId);
    if (retval > 0) {
        client->sendMsg(ResponseCode::CommandOkay, msg, false);
        return 0;
    } else {
        return operationError(client, "Can not get netId", retval);
    }
}
用法:ndc network query_netid wlan0

4 ndc
4.1 查询可用命令表
ndc interface list

4.2 清除netd DNS缓存
ndc resolver flushif eth0
ndc resolver flushdefaultif -- flush default DNS resolver

Android 8.0没有导出刷新DNS缓存的接口,可以调用如下API添加。
bionic/libc/dns/resolv/res_cache.c
_resolv_flush_cache_for_net(netId)

4.3 设置netd DNS
ndc resolver setnetdns ...
ndc resolver setnetdns eth0 "" 8.8.8.8 192.168.1.1
ndc resolver setnetdns eth0 localdomain 8.8.8.8 192.168.1.1

5 Abbreviations
mdnsd: multicast DNS,组播DNS
ndc:Native Daemon Connector
ojluni:Android libcore中的模块,包含OpenJDK、Language、Util、Net、IO

你可能感兴趣的:(Network)