HarmonyOS 鸿蒙Next网络库不兼容一些DNS解析方式
HarmonyOS 鸿蒙Next网络库不兼容一些DNS解析方式 最近我们在开发鸿蒙Next APP时发现,一些网络请求(包括接口请求和图片/视频资源加载)会出现失败的情况,报错信息包括"IO Cannot Find Host: 10 error"、"Couldn’t resolve host name"等。这些错误来自不同的组件(比如Image、AVPlayer、Video)和http网络库(@kit.NetworkKit)。
经过排查发现,所有出问题的请求都是访问同一个域名(我司自己的域名)。同样的URL地址如果交给APP的WebView组件加载(比如图片、视频链接),或者直接在系统浏览器中打开,都能正常加载。但是通过Image、Video等组件,或者通过HTTP接口请求时就会报上述错误。
我们发现一个临时解决方案:如果把当前设备WiFi的DNS地址改成"223.5.5.5",那么所有之前有问题的组件和请求都能正常工作。经过IT同事的排查,目标域名在我司DNS服务器上是正常解析的,能够正确返回IP地址,但是到了APP的网络层就出错了。
从这些现象可以判断,应该是这些组件底层使用的网络库对DNS的兼容性存在问题,请贵司帮忙排查和提供解决方案
下面调试AvPlayer catch的异常截图:
下面是错误的相关堆栈信息:
Cannot get SourceMap info, dump raw stack:
=====================Backtrace========================
#00 pc 00000000006f4588 /system/lib64/platformsdk/libark_jsruntime.so
#01 pc 00000000006f4afc /system/lib64/platformsdk/libark_jsruntime.so
#02 pc 0000000000327338 /system/lib64/platformsdk/libark_jsruntime.so
#03 pc 00000000001bd514 /system/lib64/platformsdk/libark_jsruntime.so
#04 pc 00000000001bcfa4 /system/lib64/platformsdk/libark_jsruntime.so
#05 pc 000000000024fc28 /system/lib64/platformsdk/libark_jsruntime.so
#06 pc 00000000005d1034 /system/lib64/platformsdk/libark_jsruntime.so
#07 pc 00000000005a758c /system/lib64/platformsdk/libark_jsruntime.so
#08 pc 00000000000585b0 /system/lib64/platformsdk/libace_napi.z.so
#09 pc 0000000000018b3c /system/lib64/platformsdk/libmedia_soundpool.z.so
=====================Backtrace========================
#00 pc 00000000006f4588 /system/lib64/platformsdk/libark_jsruntime.so
#01 pc 00000000006f4afc /system/lib64/platformsdk/libark_jsruntime.so
#02 pc 0000000000327338 /system/lib64/platformsdk/libark_jsruntime.so
#03 pc 00000000001bd514 /system/lib64/platformsdk/libark_jsruntime.so
#04 pc 00000000001bcfa4 /system/lib64/platformsdk/libark_jsruntime.so
#05 pc 000000000024fc28 /system/lib64/platformsdk/libark_jsruntime.so
#06 pc 00000000005d1034 /system/lib64/platformsdk/libark_jsruntime.so
#07 pc 00000000005a758c /system/lib64/platformsdk/libark_jsruntime.so
#08 pc 00000000000585b0 /system/lib64/platformsdk/libace_napi.z.so
#09 pc 0000000000018b3c /system/lib64/platformsdk/libmedia_soundpool.z.so
更多关于HarmonyOS 鸿蒙Next网络库不兼容一些DNS解析方式的实战教程也可以访问 https://www.itying.com/category-93-b0.html
存在多个DNS服务器,有相关优先级,系统会随优先级从前到后访问所有DNS服务器,而小组件只会访问主DNS服务器。
按照如下方案试试:
- 按wifiManager.getIpInfo拿到完整的wifi dns配置。
注:2-3条为并行关系 - 通过connection.addCustomDnsRule添加dns 规则。
- 通过使用MDNS访问局域网服务配置mdns,mdns就是多个dns服务器一起运转。
- 用connection的getaddressesbyname替代直接的url,相当于把解析工作拿出来单独执行一遍。
更多关于HarmonyOS 鸿蒙Next网络库不兼容一些DNS解析方式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next网络库基于ArkTS/JS开发,主要支持标准DNS over HTTPS(DoH)和系统默认解析。不兼容部分私有DNS协议如DNSCrypt、特定厂商的UDP DNS扩展。网络库强制使用TLS 1.3进行加密传输,若DNS服务器仅支持TLS 1.2或更低版本会出现兼容问题。本地hosts文件解析仅支持IPv4格式条目,IPv6格式可能被忽略。对于mDNS(组播DNS)和LLMNR(链路本地多播名称解析)等局域网解析协议,需通过鸿蒙分布式网络接口单独处理。
从描述来看,这确实是一个典型的DNS解析兼容性问题。HarmonyOS Next的网络库(@kit.NetworkKit)在处理某些DNS服务器返回的解析结果时可能存在兼容性问题。以下是关键分析点:
- 问题现象表明:
- 仅影响特定域名
- 使用公司内部DNS时失败
- 改用公共DNS(223.5.5.5)后正常
- WebView和浏览器不受影响
- 可能原因:
- 网络库对DNS响应格式的解析存在差异
- 可能不支持某些DNS记录类型或扩展字段
- 对DNS TTL或缓存处理机制不同
- 建议排查方向:
- 检查公司DNS服务器返回的响应格式是否标准
- 对比成功和失败情况下的DNS响应包差异
- 尝试在代码中强制指定DNS服务器地址
- 临时解决方案:
- 在应用层实现DNS预解析
- 使用IP直连方式(需考虑证书问题)
- 引导用户切换DNS或应用内提供DNS设置选项
建议收集完整的网络请求日志和DNS查询日志,特别是要对比成功和失败情况下的DNS查询响应数据包。这有助于准确定位网络库在解析DNS响应时的具体问题点。