升级Android Studio 3.1.0后Jacoco运行时崩溃问题
我之前也踩过这个一模一样的坑!升级到Android Studio 3.1.0和Gradle 4.4.0之后,Jacoco离线插桩直接触发NoClassDefFoundError: Failed resolution of: Lorg/jacoco/agent/rt/internal_773e439/Offline;的崩溃,折腾了好一阵才搞定,给你几个亲测有效的解决方案:
匹配Jacoco与Gradle的版本
Gradle 4.4.0对Jacoco的版本有兼容性要求,旧版本的Jacoco可能无法适配新的Gradle插件。建议在项目根目录的build.gradle中指定兼容的Jacoco版本,比如0.8.2:buildscript { repositories { mavenCentral() } dependencies { classpath 'org.jacoco:org.jacoco.core:0.8.2' // 别忘了保留你的Android Gradle插件配置,比如com.android.tools.build:gradle:3.1.0 } }阻止混淆工具移除Jacoco插桩类
如果你开启了ProGuard(AS 3.1.0默认使用ProGuard),混淆规则会把Jacoco的内部插桩类当成无用代码移除,导致运行时找不到类。在app模块的proguard-rules.pro里添加以下规则:-keep class org.jacoco.agent.rt.internal_** { *; } -dontwarn org.jacoco.agent.rt.internal_**清理缓存并重新构建
IDE升级后很容易残留旧的构建缓存,干扰Jacoco的插桩流程。可以先执行命令行清理:./gradlew clean再打开Android Studio,点击
File > Invalidate Caches / Restart...,选择Invalidate and Restart,彻底清理缓存后重新构建项目。检查离线插桩的配置正确性
如果你是手动配置Jacoco离线插桩,确保app模块的build.gradle里的插桩任务正确关联了编译流程。比如:android { buildTypes { debug { jacoco { enabled = true offlineInstrumentation = true } } } } task jacocoTestReport(type: JacocoReport) { // 确保这里的源文件、class文件路径配置正确 sourceDirectories = files(android.sourceSets.main.java.srcDirs) classDirectories = files("$buildDir/intermediates/classes/debug") executionData = files("$buildDir/jacoco/testDebugUnitTest.exec") }
这个问题本质上是升级后Jacoco插桩的类没有被正确打包进APK,要么是版本不兼容导致插桩失败,要么是被混淆工具误删,或者缓存残留影响了构建流程,按上面的步骤来基本能解决。
内容的提问来源于stack exchange,提问作者BlackHatSamurai

