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

升级至Java 17后Android Jacoco 0.8.10应用模块覆盖率为0%

解决Android应用模块Java17下Jacoco覆盖率0%问题

针对你遇到的应用模块改为library就能正常生成覆盖率、改回application就显示0%的问题,核心是自定义JacocoReport任务的路径配置与AGP 8.x + Java17的适配冲突,以下是具体修复方案:

1. 替换Jacoco报告任务配置

将你当前的jacocoTestReport任务替换为以下内容:

task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."

    def androidExclusion = [
            '**/BR.*',
            '**/R.*',
            '**/R$*.*',
            '**/BuildConfig.*',
            '**/Manifest*.*',
            '**/*Adapter*.*',
            '**/*Fragment*.*',
            '**/*ViewHolder*.*',
            '**/*ViewModelFactory*.*',
            '**/*Layout*.*'
    ]

    reports {
        xml.required.set(true)
        html.required.set(true)
        html.outputLocation = layout.buildDirectory.dir("reports/jacoco/html")
    }

    // 自动获取测试执行数据,避免硬编码路径错误
    executionData.from = files([
            layout.buildDirectory.file("jacoco/testDebugUnitTest.exec"),
            layout.buildDirectory.file("outputs/code_coverage/debugAndroidTest/connected/*coverage.ec")
    ]).filter { it.exists() }

    // 适配AGP 8.x的类文件输出路径
    classDirectories.from = files([
            fileTree(dir: layout.buildDirectory.dir("intermediates/javac/debug/classes"), excludes: androidExclusion),
            fileTree(dir: layout.buildDirectory.dir("intermediates/kotlin/debug/classes"), excludes: androidExclusion)
    ]).filter { it.exists() }

    // 包含所有源码目录(Java+Kotlin)
    sourceDirectories.from = files([
            "src/main/java",
            "src/main/kotlin"
    ])
}

2. 补充Java17适配配置

在android块内添加以下配置,确保Jacoco兼容Java17字节码:

android {
    // ... 原有配置 ...

    buildTypes {
        debug {
            debuggable true
            testCoverageEnabled true
            // 强制启用Jacoco覆盖率收集
            enableUnitTestCoverage = true
            enableAndroidTestCoverage = true
        }
        // ... release配置 ...
    }

    tasks.withType(Test) {
        jacoco {
            includeNoLocationClasses = true
            excludes = ['jdk.internal.*', 'java.lang.invoke.*']
        }
    }
}

修复关键点说明

  • 执行路径修正:应用模块的单元测试执行文件默认存储在build/jacoco/testDebugUnitTest.exec,而非你之前硬编码的旧路径;同时兼容了Instrumentation测试的覆盖率文件。
  • 类路径适配:AGP 8.x中Kotlin编译产物路径从build/tmp/kotlin-classes改为build/intermediates/kotlin/debug/classes,旧路径会导致Jacoco找不到类文件,最终显示0%覆盖率。
  • 容错处理:加入filter { it.exists() }避免因路径不存在导致任务失败。
  • Java17兼容:扩展排除规则,避开Java17新增的内部API,防止Jacoco解析字节码出错。

执行./gradlew jacocoTestReport后,可在app/build/reports/jacoco/html目录查看正常的覆盖率报告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:17:06