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

Jacoco运行时ComponentActivity报OnBackInvokedCallback缺失错误

报错根因

java.lang.NoClassDefFoundError: android/window/OnBackInvokedCallback 本质是类加载失败:OnBackInvokedCallback是Android 13(API 33)新增的系统接口,你当前引入的androidx.activity.ComponentActivity在构造方法里引用了这个类,但项目配置的编译SDK、Robolectric运行测试用的SDK版本都低于33,测试沙箱环境里找不到这个类的定义就直接崩溃。你之前回退Compose版本没效果,是因为问题出在Activity依赖版本和SDK配置不匹配,和Compose UI本身版本无关。

排查解决步骤
  • 升级编译SDK版本
    把模块构建配置里的compileSdkVersion调整为33,targetSdkVersion不需要跟着改,保持原有31就可以。新版AndroidX组件普遍要求compileSdk至少到33才能正常索引到所有系统类定义,修改后同步Gradle即可。
    配置参考:
    compileSdkVersion = 33
    buildToolsVersion = "33.0.2"
    targetSdkVersion(31) // 保持原有配置不变
    
  • 对齐Robolectric运行SDK版本
    Robolectric默认会根据项目targetSdk选择运行沙箱的SDK版本,你target是31就会用API 31的沙箱,自然找不到API 33才有的类。两种修改方式选一个就行:
    1. 在app/src/test/resources路径下新建robolectric.properties文件,添加配置:
      sdk=33
      
    2. 直接给测试类加注解指定运行SDK:
      @Config(sdk = [33])
      class BottomSheetServiceTest {
          // 原有测试代码
      }
      
  • 强制对齐androidx.activity依赖版本
    如果前两步改完还是报错,说明依赖传递拉到了不匹配的activity版本,直接在Gradle配置里强制指定稳定版即可,1.6.x系列版本对低版本SDK做了适配,不会在低版本系统里提前加载OnBackInvokedCallback类:
    configurations.all {
        resolutionStrategy.force "androidx.activity:activity-ktx:1.6.1"
        resolutionStrategy.force "androidx.activity:activity-compose:1.6.1"
    }
    
  • 升级Jacoco版本
    如果单跑测试正常,只有执行Jacoco覆盖率任务时才抛这个错,把Jacoco版本升级到0.8.8及以上,旧版本Jacoco对高版本Android字节码的插桩逻辑有缺陷,会错误触发不必要的类加载导致崩溃。
验证顺序

先单独运行BottomSheetServiceTest确认测试用例本身能正常启动TestActivity、执行逻辑无报错,再运行Jacoco覆盖率统计任务即可。

内容的提问来源于stack exchange,提问作者Ralf Wickum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:33:23