Android Studio升级后单元测试Jacoco插桩及Robolectric错误排查
问题解答
1. IllegalStateException: Cannot process instrumented class 报错原因
这个错误是Jacoco重复插桩导致的,具体触发逻辑有两个:
- Android Studio Arctic Fox 开始,AGP默认会对测试相关类做前置插桩,你额外添加的全局Jacoco插桩配置会对同一类执行二次插桩,导致类结构非法
- 你项目依赖的
org.jacoco:org.jacoco.core:0.8.7与当前使用的AGP 4.1.2自带的Jacoco版本不匹配,版本冲突也会触发插桩逻辑异常
2. Robolectric 提示have Java 1的原因
你配置的sourceCompatibility和targetCompatibility只是指定了代码编译的字节码版本,不影响Gradle测试任务运行时使用的JDK版本:
- Android Studio Arctic Fox 默认自带JDK 11作为Gradle运行时JDK
- 你使用的Robolectric 4.3.1版本存在JDK版本识别bug,无法正确识别JDK 11的版本号,会错误返回
1的版本标识,因此抛出匹配错误
3. 修复需要补充的配置
按如下步骤调整即可解决所有问题:
调整Jacoco配置,解决重复插桩
把你现有的Jacoco配置替换为如下内容,避免二次插桩,同时对齐AGP兼容的Jacoco版本:
plugins.withId("jacoco") { tasks.withType(Test) { task -> // 仅对单元测试启用该配置,关闭全局插桩 if (task.name.contains("UnitTest")) { task.jacoco.includeNoLocationClasses = true task.jacoco.excludes = ['jdk.internal.*'] } } } // 移除自定义的jacoco core依赖,使用AGP自带的版本即可,或者降级为0.8.5版本与AGP4.1.2匹配
修复Robolectric版本识别问题
二选一即可:
- 升级Robolectric版本到4.6+,该版本已修复JDK 11的识别bug:
testApi "org.robolectric:robolectric:4.6" - 保留现有Robolectric版本的情况下,补充两个配置:
- 在
robolectric.properties中添加一行java.version=1.8 - 在android配置块下添加testOptions配置:
android { // 原有配置不变 testOptions { unitTests.all { jvmArgs '-noverify' systemProperty 'java.version', '1.8' } } } - 在
如果仍有问题,可以在Android Studio设置中,把Build, Execution, Deployment > Build Tools > Gradle下的Gradle JDK改为本地安装的JDK 8即可。
内容的提问来源于stack exchange,提问作者lannyf
相关产品推荐
相关产品推荐

