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

集成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:54:01