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

JaCoCo代码覆盖率显示0%问题求助(Gradle 3.0.1)

问题分析与解决方案

你遇到的核心问题是Gradle 3.0+的目录结构变化结合Flavor配置,导致JaCoCo找不到正确的类文件和执行数据,最终出现报告为空或覆盖率显示0%的情况。下面是具体的问题点和修复方案:

1. 类文件目录路径错误

Gradle 3.0+之后,Android插件调整了编译产物的存放路径——当使用自定义Flavor时,编译后的class文件不再放在intermediates/classes/debug,而是迁移到了intermediates/javac/<MyFlavor>Debug/classes目录(路径包含你的Flavor名称)。你原来的配置没有适配这个变化,导致JaCoCo找不到需要分析的类文件。

2. 执行数据(.exec文件)路径不准确

你当前的executionData配置在项目根目录下全局搜索.exec文件,这要么会找到无关的旧文件,要么根本找不到test<MyFlavor>DebugUnitTest任务生成的正确文件——该文件默认存放在build/jacoco/目录下,而非项目根目录。

3. 冗余任务冲突(可选优化)

你同时执行了Android自带的create<MyFlavor>DebugCoverageReport和自定义的jacocoTestReport,两者可能会互相干扰,建议只执行自定义的Jacoco任务即可。


修改后的Jacoco配置示例

把你原来的jacocoTestReport任务替换成以下内容(记得将<MyFlavor>替换为你的实际Flavor名称):

task jacocoTestReport(type: JacocoReport, dependsOn: "test<MyFlavor>DebugUnitTest") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports"

    reports {
        xml.enabled = true
        html.enabled = true
    }

    // 排除不需要统计的类(可根据项目需求调整)
    def fileFilter = [
            '**/R.class',
            '**/R$*.class',
            '**/BuildConfig.class',
            '**/Manifest*.*',
            '**/*Test*.class' // 排除测试类本身
    ]

    // 修正类文件路径:包含Flavor名称
    def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/<MyFlavor>Debug/classes", excludes: fileFilter)
    // 如果项目使用Kotlin,需额外添加Kotlin编译的class文件路径:
    // def kotlinDebugTree = fileTree(dir: "${buildDir}/tmp/kotlin-classes/<MyFlavor>Debug", excludes: fileFilter)

    def mainSrc = "${project.projectDir}/src/main/java"
    // 若Flavor有独立源码目录,需添加:
    // def flavorSrc = "${project.projectDir}/src/<MyFlavor>/java"

    sourceDirectories = files([mainSrc])
    // 若添加了Flavor源码,改为files([mainSrc, flavorSrc])
    classDirectories = files([debugTree])
    // 若使用Kotlin,改为files([debugTree, kotlinDebugTree])

    // 修正执行数据路径:指向正确的.exec文件
    executionData = files("${buildDir}/jacoco/test<MyFlavor>DebugUnitTest.exec")
}

验证步骤

  1. 清理旧编译产物:
    ./gradlew clean
    
  2. 执行测试并生成报告:
    ./gradlew test<MyFlavor>DebugUnitTest jacocoTestReport
    
  3. 打开报告:build/reports/jacoco/jacocoTestReport/html/index.html,此时应该能看到你的项目包和正常的覆盖率数据了。

关于Android Studio打开.exec显示0%的问题

这是因为AS默认找不到对应的类文件路径,你可以在打开.exec文件时,手动指定类文件目录(即上面配置的${buildDir}/intermediates/javac/<MyFlavor>Debug/classes),就能正确显示覆盖率了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:02:44