Android集成Hilt时Jacoco报错需提供原始未插桩类问题咨询
问题解决方案
针对你提出的三个疑问,结论如下:
- Gradle版Jacoco从0.8.2版本开始就支持还原插桩类的能力,和Maven版
restore-instrumented-classes的作用完全一致。只是Gradle插件没有全局统一的配置项,会按构建变体自动生成对应任务,命名规则为jacoco<构建变体名>RestoreInstrumentedClasses。 - 所谓“需要完全放弃Jacoco覆盖率统计”的方案属于理解偏差。这类方案本质是为了规避报错直接关闭了注解处理阶段的Jacoco插桩逻辑,完全没必要,只要调整任务执行顺序即可保留完整的覆盖率统计能力。
- 该问题和是否是多模块项目无关,核心冲突原因是任务执行顺序错误:Jacoco提前对字节码做了插桩,后续Hilt的kapt注解处理器扫描类文件时读到了被修改过的插桩字节码,无法识别就抛出异常,单模块项目只要任务顺序不对就会触发。
具体配置步骤(适配你当前的环境版本)
- 调整任务依赖顺序,在app模块的
build.gradle中添加如下配置,确保Hilt的kapt任务执行前,先执行Jacoco的插桩类还原任务:
tasks.whenTaskAdded { task -> // 适配Debug构建变体,所有开启了Jacoco插桩的变体都需要对应配置 if (task.name == "kaptDebugKotlin") { task.dependsOn "jacocoDebugRestoreInstrumentedClasses" } // 如果Release构建也开启了Jacoco插桩,添加对应配置 if (task.name == "kaptReleaseKotlin") { task.dependsOn "jacocoReleaseRestoreInstrumentedClasses" } }
- (可选优化)配置Jacoco覆盖率报告时排除Hilt自动生成的类,避免无意义的生成代码干扰覆盖率统计结果:
jacocoTestReport { reports { xml.required.set(true) html.required.set(true) } afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it, excludes: [ "**/hilt_aggregated_deps/**", "**/*Hilt*.*", "**/*_Factory.class", "**/*_MembersInjector.class", "**/BuildConfig.*", "**/Manifest*.*" ]) })) } }
该配置是Jacoco官方提供的标准能力,不需要升级或降级你当前使用的AGP、Gradle、Jacoco、Hilt版本,不会产生额外的兼容性问题。
验证方式
配置完成后执行构建命令,观察任务执行顺序:jacoco<Variant>RestoreInstrumentedClasses会在kapt<Variant>Kotlin之前执行,构建不会再抛出"Please supply original non-instrumented classes"的异常,同时Jacoco覆盖率任务可以正常生成统计报告。
内容的提问来源于stack exchange,提问作者Cheolho Jeon
相关产品推荐
相关产品推荐

