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+
验证步骤
修改配置后重新执行以下任务:
- 运行单元测试:
./gradlew testDebugUnitTest(替换为对应变体的测试任务) - 生成覆盖率报告:
./gradlew jacocoTestReport - 查看报告确认
MyApplication类的覆盖率是否恢复正常
内容的提问来源于stack exchange,提问作者Marco Zielbauer
相关产品推荐
相关产品推荐

