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

Jacoco执行数据与Hilt类不匹配致覆盖率0%的解决办法

解决Hilt+Jacoco导致Application类覆盖率0%的问题

问题现象

  • 生成Jacoco覆盖率报告时触发报错:[ant:jacocoReport] Execution data for class de/abc/def/MyApplication does not match
  • 最终报告里MyApplication类的覆盖率显示为0%
  • 仅标注@HiltAndroidApp的MyApplication类出问题,移除该注解后覆盖率恢复正常

原因分析

Hilt的@HiltAndroidApp注解会在编译期自动生成类似Hilt_MyApplication的代理类,Jacoco收集执行数据时会把原始类和代理类的数据混淆,导致类匹配失败,最终无法正确统计原始MyApplication类的覆盖率。

解决方案

方案1:排除Hilt生成的代理类(推荐)

在Jacoco配置里过滤掉以Hilt_开头的代理类,避免执行数据冲突。修改模块的build.gradle或build.gradle.kts:

Groovy版本

jacoco {
    toolVersion = "0.8.10"
}

tasks.withType(Test) {
    jacoco.includeNoLocationClasses = true
}

tasks.withType(JacocoReport) {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                "**/Hilt_*.class"
            ])
        }))
    }
}

Kotlin DSL版本

jacoco {
    toolVersion = "0.8.10"
}

tasks.withType<Test> {
    jacoco.includeNoLocationClasses = true
}

tasks.withType<JacocoReport> {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.map {
            fileTree(it) {
                exclude("**/Hilt_*.class")
            }
        }))
    }
}

方案2:补充测试触发类执行

如果需要统计MyApplication的基础覆盖率,可以在测试类里加个空测试,确保Jacoco能收集到类加载的执行数据:

@HiltAndroidTest
class MyApplicationTest {

    @Test
    fun testApplicationLoad() {
        // 空测试,触发类加载让Jacoco捕获执行数据
    }
}

方案3:升级依赖版本

尝试升级到更兼容的依赖组合,新版本可能修复了兼容性问题:

  • AGP 7.4.0+
  • Gradle 7.5+
  • Jacoco 0.8.11+

验证步骤

修改配置后重新执行以下任务:

  1. 运行单元测试:./gradlew testDebugUnitTest(替换为对应变体的测试任务)
  2. 生成覆盖率报告:./gradlew jacocoTestReport
  3. 查看报告确认MyApplication类的覆盖率是否恢复正常

内容的提问来源于stack exchange,提问作者Marco Zielbauer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:54:59