Android应用随机出现maps.googleapis.com域名解析UnknownHostException崩溃如何处理
问题说明
Dns.kt是OkHttp第三方网络库的内部类,不属于你的项目代码,所以你在本地项目中搜索不到该文件属于正常情况。
本次崩溃的根因是DNS解析失败:当应用请求maps.googleapis.com相关服务时,系统底层调用DNS查询接口尝试解析该域名的IP地址,返回了EAI_NODATA错误(没有找到和该域名关联的IP地址),OkHttp默认没有捕获该类型异常,最终导致应用直接崩溃。
该崩溃随机出现的常见诱因:
- 触发崩溃的用户设备处于无网络、弱网络环境,DNS请求超时失败
- 用户所在区域无法正常访问谷歌服务(例如中国大陆地区用户没有特殊网络配置),运营商直接拦截了该域名的解析请求
- 用户使用的运营商DNS服务器临时故障、存在DNS污染等问题
解决方案
1. 自定义OkHttp DNS实现,全局捕获解析异常
你可以包装OkHttp默认的DNS实现,主动捕获DNS解析过程中抛出的异常,避免未捕获异常直接导致崩溃,示例代码如下:
class SafeDns : Dns { override fun lookup(hostname: String): List<InetAddress> { return try { Dns.SYSTEM.lookup(hostname) } catch (e: UnknownHostException) { // 也可以在这里添加降级逻辑,比如用公共DNS二次查询 emptyList() } catch (e: GaiException) { emptyList() } } }
构造OkHttpClient的时候注入自定义的DNS即可生效:
val okHttpClient = OkHttpClient.Builder() .dns(SafeDns()) // 其他OkHttp配置项 .build()
2. 增加域名访问的区域适配
如果你的应用有中国大陆地区用户,maps.googleapis.com默认无法访问,建议根据用户区域做适配:
- 国内用户切换为高德、百度等国内地图服务
- 检测到用户访问谷歌地图服务失败时,弹出友好提示告知用户当前网络无法使用地图功能,不要直接崩溃
3. 优化网络重试逻辑
可以在DNS解析失败后,增加重试逻辑:
- 切换公共DNS(阿里云公共DNS、114DNS等)二次解析域名
- 配置OkHttp的重试次数,针对网络类异常做自动重试
4. 前置网络状态检查
发起地图相关的网络请求前,先检查设备网络是否可用,网络不可用时直接给出提示,不需要发起后续请求。
内容的提问来源于stack exchange,提问作者Bolt UIX
相关产品推荐
相关产品推荐

