Android 指定 DNS (为什么新用户安装完你的App后,与Api服务连接失败?)

作者 bluse wang 日期 2019-07-16
Android 指定 DNS (为什么新用户安装完你的App后,与Api服务连接失败?)

过去一直有个问题:发现我的新用户在安装完App后,打开时提示没有网络(连接到我的Api服务器失败)

直到今天翻qiniu的SDK时才明白过来,问题可能在DNS

七牛的SDK一直使用了一个叫HappyDNS的一个库。我一直以为这是“脱裤子放屁”。

直到今天才明白这中间的“中国特色”

Android

环境

  • 开发工具:Android Studio
  • 语言:Kotlin
  • 依赖包:
    • com.squareup.okhttp3:okhttp:3.14.2
    • com.qiniu:happy-dns:0.2.13

关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
val client = OkHttpClient.Builder()
.dns {
if (it == "my.api.host.domain.name") {
InetAddress.getAllByName(Config.SERVER_IP).toMutableList()
}else{
try{
val resolvers = mutableListOf<IResolver>()
try{
resolvers.add(Resolver(InetAddress.getByName("119.29.29.29")))
}catch (e:Exception){}
try{
resolvers.add(Resolver(InetAddress.getByName("114.114.114.114")))
}catch (e:Exception){}
try{
resolvers.add(Resolver(InetAddress.getByName("8.8.8.8")))
}catch (e:Exception){}
if (resolvers.size == 0) throw UnknownHostException("$it resolver fail")
DnsManager(NetworkInfo.normal,resolvers.toTypedArray()).queryInetAdress(Domain(it)).toMutableList()
}catch (e:Exception){
Dns.SYSTEM.lookup(it)
}
}
}.build()