升级至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
相关产品推荐
相关产品推荐

