You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,配置方式如下:
    // 替换HttpClient(CIO)为HttpClient(OkHttp)
    fun provideHttpClient(): HttpClient = HttpClient(OkHttp) {
        // 其余配置保持不变
    }
    
    注意需要添加OkHttp引擎的依赖:
    implementation("io.ktor:ktor-client-okhttp:$ktor_version")
    

额外检查项

  • 确认Fiddler已正确安装根证书到Android设备的用户证书目录(不是系统目录)。
  • 确保测试设备的代理设置指向Fiddler的IP和端口。
  • 对于HTTPS请求,cleartextTrafficPermitted设置不生效,无需额外配置(该设置仅针对明文HTTP)。

内容的提问来源于stack exchange,提问作者Kunu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:13:11