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才有的类。两种修改方式选一个就行:- 在
app/src/test/resources路径下新建robolectric.properties文件,添加配置:sdk=33 - 直接给测试类加注解指定运行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
相关产品推荐
相关产品推荐

