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

生成Jacoco报告时排除Android Instrumentation测试并合并多模块报告

无设备环境下排除Instrumentation测试生成覆盖率

你遇到的报错是因为createDebugCoverageReport任务默认同时依赖Instrumentation测试任务connectedDebugAndroidTest和单元测试任务,会同时收集两类测试的覆盖率数据。不需要Instrumentation测试覆盖率的话可以直接禁用相关任务,调整配置如下:

  1. 在每个模块的Jacoco配置中添加规则,禁用Instrumentation相关任务:
tasks.matching { task ->
    task.name.contains("createDebugAndroidTestCoverageReport") || task.name.contains("connectedDebugAndroidTest")
}.configureEach {
    enabled = false
}
  1. 执行单元测试覆盖率任务即可,不会触发设备相关校验:
./gradlew testDebugUnitTestCoverage
多模块Jacoco覆盖率报告合并

在项目根目录的build.gradle中添加合并报告任务即可,配置示例如下:

apply plugin: 'jacoco'

// 全量覆盖率合并任务
task jacocoFullReport(type: JacocoReport) {
    // 依赖所有模块的Debug单元测试任务,确保先跑完所有单测生成覆盖率数据
    dependsOn subprojects.tasks.matching { it.name == 'testDebugUnitTest' }

    // 收集所有模块的源码路径
    sourceDirectories.from = subprojects.collect {
        it.android.sourceSets.main.java.srcDirs
    }

    // 收集所有模块的编译后class文件,过滤自动生成的无用类
    classDirectories.from = subprojects.collect { project ->
        fileTree(dir: project.buildDir, includes: [
            "intermediates/javac/debug/classes/**/*.class",
            "intermediates/kotlin_classes/debug/**/*.class" // Kotlin代码需要添加该路径
        ], excludes: [
            "**/R.class",
            "**/R$*.class",
            "**/BuildConfig.*",
            "**/Manifest*.*",
            "**/*_Hilt*.*", // Hilt生成类
            "**/*databinding*.*" // DataBinding生成类
        ])
    }

    // 收集所有模块的单元测试覆盖率数据文件
    executionData.from = subprojects.collect { project ->
        fileTree(dir: project.buildDir, includes: [
            "jacoco/testDebugUnitTest.exec",
            "outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec" // AGP 7.0+默认路径
        ])
    }

    // 配置报告输出规则
    reports {
        html {
            enabled = true
            destination = file("${rootProject.buildDir}/reports/jacoco/full/html")
        }
        xml {
            enabled = true
            destination = file("${rootProject.buildDir}/reports/jacoco/full/jacoco.xml")
        }
    }
}

配置完成后执行如下命令即可生成全量合并报告:

./gradlew jacocoFullReport

报告默认输出到根项目build/reports/jacoco/full目录下。

注意事项

  • 若项目使用非Debug的构建变体,将配置中所有debug关键词替换为对应变体名即可
  • 若有其他自动生成的代码不需要统计覆盖率,直接在classDirectories的excludes规则中添加对应路径即可
  • 不同AGP版本的class文件、覆盖率数据文件路径可能存在差异,若提示无覆盖率数据,可到对应模块的build目录下搜索对应文件调整路径规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:48:02