App端内网络监控

App端内网络监控

Jun 21 ·
5 分钟阅读

App 运行环境复杂,用户投诉中很大一部分来源于”页面加载慢”、“登录失败”、“连接不稳定”等网络相关问题,而这些问题在测试环境中难以复现。传统的服务端监控或 CDN 日志,无法还原终端真实的网络状态。

因此,我们希望:

应用网速检查

🔍 原理

该模块基于 Android 原生的 TrafficStats API,按应用 UID 粒度,在固定短时窗口内(如 5 秒)读取接收流量增量,并通过增量字节数除以时间差来计算出客户端的真实下载速度,无需额外权限或网络请求,运行轻量且接近用户真实网络体验。

🕒 检查时机

每次检查都有去重机制,确保 5 秒内不重复执行。

📊 数据上报

内容示例值
平均下载速度32000
当前网络类型WIFI / 4G / 5G
运营商名称中国联通
移动网络信号强度-88
是否处于漫游状态false
WiFi 信号等级3
当前检测的触发场景app_launch / net_change

注:部分字段需特定权限支持,只会判断不会尝试申请,若权限缺失将不会上报对应字段

DNS 劫持检测

🔍 原理

DNS 劫持是客户端常见的网络安全问题,尤其在公共 WiFi 或部分三线运营商环境下更易复现。我们通过 “系统 DNS” 与 “可信 DoH 服务” 的解析结果对比 来识别是否存在劫持行为。

判断逻辑:

🕒 检查时机

为了节省资源,DNS 劫持检查 仅在出现网络请求失败命中特定异常类型集合时触发,并设置 5 秒冷却时间防止重复触发。

相比启动时、切网时等高频触发机制,这种 按需触发 + 精准异常命中 的策略更具性价比,避免不必要的资源开销。

⚠️ 异常类型集

网络异常中可能与 DNS 劫持有关的典型异常。

异常类型原因分类说明
CertPathValidatorException证书不可信TLS 证书签名链不受信任,常见于中间人攻击
SSLHandshakeException / SSLPeerUnverifiedExceptionTLS 握手失败证书链异常或握手中断
UnknownHostExceptionDNS 解析失败无法将域名解析为 IP,常见于 DNS 劫持或被污染
ConnectException连接被拒绝网络可达但目标端口未响应,可能是劫持后伪地址
SocketTimeoutExceptionTCP 超时网络拥堵或服务不可达

📊 数据上报

内容示例值
检查目标域名api.example.com
系统 DNS 返回的 IP 列表1.2.3.4,5.6.7.8
DoH 返回的 IP 汇总池1.2.3.4,9.9.9.9
是否判定为 DNS 劫持true / false
触发检查的异常类型UnknownHostException
当前网络类型WIFI / 4G
编辑于 Jul 13