集成Jetpack Compose后App启动报JaCoCo Offline类未找到错误如何解决?
集成Jetpack Compose后启动应用抛出JaCoCo类找不到异常解决方案
问题现象
在应用模块集成Jetpack Compose依赖后,每次启动应用都会在Application类抛出异常。
堆栈信息
2021-10-22 11:16:01.079 16281-16281/com.example E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example, PID: 16281 java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jacoco/agent/rt/internal_8ff85ea/Offline; at com.example.app.MyApplication.attachBaseContext(MyApplication.java:719) at android.app.Application.attach(Application.java:361) at android.app.Instrumentation.newApplication(Instrumentation.java:1159) at android.app.LoadedApk.makeApplication(LoadedApk.java:1324) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7223) at android.app.ActivityThread.access$1600(ActivityThread.java:298) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2172) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:264) at android.app.ActivityThread.main(ActivityThread.java:8248) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049) Caused by: java.lang.ClassNotFoundException: Didn't find class "org.jacoco.agent.rt.internal_8ff85ea.Offline" on path: DexPathList[[zip file "/data/app/~~MsNoI2GIvO6hDqGPC9BKfw==/com.example-jknI-wJelwi0a-NSFCz0ig==/base.apk"] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at com.example.app.MyApplication.attachBaseContext(MyApplication.java:719) at android.app.Application.attach(Application.java:361) at android.app.Instrumentation.newApplication(Instrumentation.java:1159) at android.app.LoadedApk.makeApplication(LoadedApk.java:1324) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7223) at android.app.ActivityThread.access$1600(ActivityThread.java:298) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2172) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:264) at android.app.ActivityThread.main(ActivityThread.java:8248) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049) Suppressed: java.io.IOException: No original dex files found for dex location (arm64) /data/app/~~MsNoI2GIvO6hDqGPC9BKfw==/com.example-jknI-wJelwi0a-NSFCz0ig==/split_config.arm64_v8a.apk at dalvik.system.DexFile.openDexFileNative(Native Method) at dalvik.system.DexFile.openDexFile(DexFile.java:379) at dalvik.system.DexFile.<init>(DexFile.java:112) at dalvik.system.DexFile.<init>(DexFile.java:85) at dalvik.system.DexPathList.loadDexFile(DexPathList.java:439) at dalvik.system.DexPathList.makeDexElements(DexPathList.java:398) at dalvik.system.DexPathList.<init>(DexPathList.java:166) at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:129) at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:104) at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:74) at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:87) at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:116) at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:114) at android.app.ApplicationLoaders.getClassLoaderWithSharedLibraries(ApplicationLoaders.java:60) at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:981) at android.app.LoadedApk.getClassLoader(LoadedApk.java:1038) at android.app.LoadedApk.getResources(LoadedApk.java:1270) at android.app.ContextImpl.createAppContext(ContextImpl.java:2750) at android.app.ContextImpl.createAppContext(ContextImpl.java:2742) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7128) 2021-10-22 11:16:01.080 16281-16281/com.example E/AndroidRuntime: ... 8 more Suppressed: java.io.IOException: No original dex files found for dex location (arm64) /data/app/~~MsNoI2GIvO6hDqGPC9BKfw==/com.example-jknI-wJelwi0a-NSFCz0ig==/split_config.xxhdpi.apk at dalvik.system.DexFile.openDexFileNative(Native Method) at dalvik.system.DexFile.openDexFile(DexFile.java:379) at dalvik.system.DexFile.<init>(DexFile.java:112) at dalvik.system.DexFile.<init>(DexFile.java:85) at dalvik.system.DexPathList.loadDexFile(DexPathList.java:439) at dalvik.system.DexPathList.makeDexElements(DexPathList.java:398) at dalvik.system.DexPathList.<init>(DexPathList.java:166) at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:129) at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:104) at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:74) at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:87) at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:116) at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:114) at android.app.ApplicationLoaders.getClassLoaderWithSharedLibraries(ApplicationLoaders.java:60) at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:981) at android.app.LoadedApk.getClassLoader(LoadedApk.java:1038) at android.app.LoadedApk.getResources(LoadedApk.java:1270) at android.app.ContextImpl.createAppContext(ContextImpl.java:2750) at android.app.ContextImpl.createAppContext(ContextImpl.java:2742) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7128) ... 8 more
项目环境配置
- IDE: Android Studio Arctic Fox 稳定版 | Patch 3
- Java JDK 版本:11
- Kotlin 版本:1.5.30
- Jetpack Compose 版本:1.0.3
- Android Gradle 插件版本:7.0.2
- Gradle Wrapper 版本:7.0.2
- JaCoCo 版本:0.8.7
相关build.gradle配置
jacoco { toolVersion = "0.8.7" } android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } buildTypes { debug { testCoverageEnabled true } }
根因分析
该问题是Android Gradle Plugin 7.0+开启测试覆盖率(testCoverageEnabled true)后,和Jetpack Compose的构建流程冲突导致的:AGP 7.0+默认内置的JaCoCo版本和手动指定的0.8.7版本不匹配,Compose的字节码插桩流程会打断JaCoCo的插桩,最终导致运行时缺失JaCoCo的Offline类。
解决方案
方案1:调试阶段临时关闭测试覆盖率
如果当前不需要跑覆盖率统计,直接修改debug构建类型的配置:
buildTypes { debug { testCoverageEnabled false } }
修改后重新构建即可解决启动崩溃问题。
方案2:强制指定统一JaCoCo版本
在app模块的build.gradle中添加JaCoCo运行时依赖,统一版本:
dependencies { implementation "org.jacoco:org.jacoco.agent:0.8.7:runtime" androidTestImplementation "org.jacoco:org.jacoco.agent:0.8.7:runtime" }
多模块项目需要在所有开启了覆盖率的模块都添加该依赖。
方案3:升级AGP到7.1.0及以上版本
该版本官方已经修复了Compose和JaCoCo插桩的冲突问题,升级后保持原配置即可正常使用。
内容的提问来源于stack exchange,提问作者Shreyas Patil
相关产品推荐
相关产品推荐

