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

Android集成Hilt时Jacoco报错需提供原始未插桩类问题咨询

问题解决方案

针对你提出的三个疑问,结论如下:

  • Gradle版Jacoco从0.8.2版本开始就支持还原插桩类的能力,和Maven版restore-instrumented-classes的作用完全一致。只是Gradle插件没有全局统一的配置项,会按构建变体自动生成对应任务,命名规则为jacoco<构建变体名>RestoreInstrumentedClasses。
  • 所谓“需要完全放弃Jacoco覆盖率统计”的方案属于理解偏差。这类方案本质是为了规避报错直接关闭了注解处理阶段的Jacoco插桩逻辑,完全没必要,只要调整任务执行顺序即可保留完整的覆盖率统计能力。
  • 该问题和是否是多模块项目无关,核心冲突原因是任务执行顺序错误:Jacoco提前对字节码做了插桩,后续Hilt的kapt注解处理器扫描类文件时读到了被修改过的插桩字节码,无法识别就抛出异常,单模块项目只要任务顺序不对就会触发。
具体配置步骤(适配你当前的环境版本)
  1. 调整任务依赖顺序,在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"
    }
}
  1. (可选优化)配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:15:33