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
相关产品推荐
相关产品推荐

