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

Android仪器化测试遇BouncyCastle异常无法运行求解决

Android仪器化测试因BouncyCastle依赖冲突无法运行

问题详情

此前仪器化测试突然失效,签名测试APK时出现BouncyCastle相关异常。通过git bisect定位到是添加依赖BouncyCastle的pdfbox导致问题,但移除HEAD中的pdfbox后测试仍无法正常运行。

注: 可正常构建并签名Release和Debug APK,能运行本地JUnit测试、Robolectric测试,甚至可手动构建测试APK并通过adb推送到设备运行,但无法通过Android Studio或Gradle启动仪器化测试。新建测试项目可正常运行测试,推测是项目依赖破坏了构建系统。

已尝试在gradle.properties中添加以下配置,但无效:

android.jetifier.ignorelist=bcprov

执行./gradlew connectedDebugAndroidTest --stacktrace的核心错误输出:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder
...
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.NoSuchFieldError: id_alg_hss_lms_hashsig [in thread "Execution worker Thread 8"]

解决方案

1. 强制统一Gradle构建类路径的BouncyCastle版本

问题根源是Gradle构建过程中(而非APP运行时)的BouncyCastle版本冲突:UTP(Android官方测试运行器)依赖的版本和项目引入的版本不一致,导致类初始化失败。

先执行命令查看构建类路径的依赖树,找出冲突的版本:

./gradlew app:dependencies --configuration classpath

在项目根目录的build.gradle中,强制指定UTP兼容的BouncyCastle版本:

buildscript {
    configurations.all {
        resolutionStrategy {
            // 替换为依赖树中UTP使用的版本,比如1.70
            force 'org.bouncycastle:bcprov-jdk15on:1.70'
            force 'org.bouncycastle:bcpkix-jdk15on:1.70'
        }
    }
    // 其他buildscript配置...
}

2. 清理Gradle缓存

移除残留的冲突依赖文件:

./gradlew clean
rm -rf ~/.gradle/caches

3. 调整项目依赖的BouncyCastle引入方式

如果必须保留pdfbox,排除其自带的BouncyCastle依赖,统一引入兼容版本:

implementation('org.apache.pdfbox:pdfbox:2.0.29') {
    exclude group: 'org.bouncycastle'
}
implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
implementation 'org.bouncycastle:bcpkix-jdk15on:1.70'

4. 临时禁用UTP的TLS功能(应急方案)

若上述方法无效,可在gradle.properties中添加配置绕过TLS证书生成:

android.test.utp.use.tls=false

验证

重新运行仪器化测试:

./gradlew connectedDebugAndroidTest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:48:09