Android下Network Inspector与Fiddler无法捕获Ktor CIO网络请求
解决Ktor CIO引擎请求无法被Network Inspector和Fiddler拦截的问题
1. 配置CIO引擎使用系统代理
Fiddler通过代理拦截流量,但CIO引擎默认不会自动读取系统代理设置,需要手动配置:
在engine块中添加代理配置,读取系统的HTTP代理信息:
engine { // 获取系统代理配置 val proxyHost = System.getProperty("http.proxyHost") val proxyPort = System.getProperty("http.proxyPort")?.toInt() proxyHost?.let { host -> proxyPort?.let { port -> proxy = ProxyBuilder.http(InetSocketAddress(host, port)) } } // 原有的https配置... }
如果是测试环境固定代理(比如Fiddler默认的127.0.0.1:8888),也可以直接硬编码:
proxy = ProxyBuilder.http(InetSocketAddress("127.0.0.1", 8888))
2. 修复自定义TrustManager,正确信任用户证书(Fiddler根证书)
你当前的自定义TrustManager是空实现,看似信任所有证书,但实际未正确处理系统和用户证书链,可能导致Fiddler证书不被认可,同时影响Network Inspector监控。替换为合并系统与用户证书的TrustManager:
// 工具方法:获取系统TrustManager private fun getSystemTrustManager(): X509TrustManager { val factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) factory.init(null as KeyStore?) return factory.trustManagers.first { it is X509TrustManager } as X509TrustManager } // 工具方法:获取用户TrustManager(对应network_security_config中的user证书) private fun getUserTrustManager(): X509TrustManager { val keyStore = KeyStore.getInstance("AndroidCAStore") keyStore.load(null, null) val factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) factory.init(keyStore) return factory.trustManagers.first { it is X509TrustManager } as X509TrustManager } // 创建合并系统与用户证书的TrustManager private fun createCombinedTrustManager(): X509TrustManager { val systemTm = getSystemTrustManager() val userTm = getUserTrustManager() val allAcceptedCerts = mutableListOf<X509Certificate>() allAcceptedCerts.addAll(systemTm.acceptedIssuers) allAcceptedCerts.addAll(userTm.acceptedIssuers) return object : X509TrustManager { override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) { systemTm.checkClientTrusted(chain, authType) } override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) { try { // 先尝试系统证书验证 systemTm.checkServerTrusted(chain, authType) } catch (e: CertificateException) { // 系统验证失败,尝试用户证书(比如Fiddler的根证书) userTm.checkServerTrusted(chain, authType) } } override fun getAcceptedIssuers(): Array<X509Certificate> { return allAcceptedCerts.toTypedArray() } } }
然后在CIO的engine配置中替换原有的trustManager:
engine { https { trustManager = @SuppressLint("CustomX509TrustManager") createCombinedTrustManager() } // 代理配置... }
3. 确保Network Inspector能捕获CIO请求
CIO引擎是Ktor自研的非Android原生网络引擎,默认不支持Android Studio的Network Inspector监控。如果必须使用CIO,可以通过以下方式间接查看:
- 确保
Logging插件的level设置为LogLevel.ALL,日志中会输出完整的请求URL和参数。 - 或者临时切换到OkHttp引擎(Ktor支持OkHttp作为引擎),OkHttp原生支持Network Inspector,配置方式如下:
注意需要添加OkHttp引擎的依赖:// 替换HttpClient(CIO)为HttpClient(OkHttp) fun provideHttpClient(): HttpClient = HttpClient(OkHttp) { // 其余配置保持不变 }implementation("io.ktor:ktor-client-okhttp:$ktor_version")
额外检查项
- 确认Fiddler已正确安装根证书到Android设备的用户证书目录(不是系统目录)。
- 确保测试设备的代理设置指向Fiddler的IP和端口。
- 对于HTTPS请求,
cleartextTrafficPermitted设置不生效,无需额外配置(该设置仅针对明文HTTP)。
内容的提问来源于stack exchange,提问作者Kunu
相关产品推荐
相关产品推荐

