Android - Jacoco 没有正确生成 xml 报告(已解决)

Android - Jacoco does not generate xml report properly(solved)

我们已将 JaCoCo 插件集成到我们的 Android 项目中,以通过 SonarQube 测量代码覆盖率。但是,无法测量。因为 SonarQube 期望覆盖率报告为 XML 格式。我们将自定义 jacocoTestReport 任务添加到 build.gradle(模块)。它生成一个 xml 文件,但不包含任何覆盖率信息。你遇到过这样的问题吗?如果遇到过,有什么解决办法吗?

build.gradle(根)

classpath "org.jacoco:org.jacoco.core:0.8.5"

build.gradle(模块)

apply plugin: 'jacoco'




...




task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
reports {
    xml.enabled = true
    html.enabled = true
}

def fileFilter = ['**/R.class',
                  '**/R$*.class',
                  '**/BuildConfig.*',
                  '**/Manifest*.*',
                  '**/*Test*.*',
                  'android/**/*.*']
def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"

getSourceDirectories().setFrom(files([mainSrc]))
getClassDirectories().setFrom(files([debugTree]))
getExecutionData().setFrom(fileTree(dir: "$buildDir", includes: [
        "jacoco/testDebugUnitTest.exec",
        "outputs/code-coverage/connected/*coverage.ec"
]))

输出:

你的 gradle 版本是什么? gradle 6.4+ 似乎有一些问题 https://github.com/gradle/gradle/issues/14132

经过一番谷歌搜索,我终于解决了这个问题。源和 class 目录的路径不正确。正确的路径应该是这样的:

            def javaClasses = fileTree(dir: variant.javaCompileProvider.get().destinationDir,
                    excludes: fileFilter)
            def kotlinClasses = fileTree(dir: "${buildDir}/tmp/kotlin-classes/${variantName}",
                    excludes: fileFilter)

            classDirectories.setFrom(files([
                    javaClasses,
                    kotlinClasses
            ]))

            def variantSourceSets = variant.sourceSets.java.srcDirs.collect { it.path }.flatten()
            sourceDirectories.setFrom(project.files(variantSourceSets))

此致,