Android Gradle 插件 3.1.0 不再找到 androidJacocoAnt 配置

androidJacocoAnt configuration no longer found with Android Gradle plugin 3.1.0

更新到 Android Gradle 插件 3.1.0(从 3.0.1 开始)后,我的 JaCoCo 单元测试覆盖率配置开始在 Gradle 配置阶段产生错误:

> Configuration with name 'androidJacocoAnt' not found.

项目级build.gradle:

dependencies {
    classpath 'com.android.tools.build:gradle:3.1.0'
    classpath "org.jacoco:org.jacoco.core:0.8.1"
}

模块级 build.gradle:

apply plugin: 'jacoco'

...

android {
    buildTypes {
        debug {
            testCoverageEnabled true
        }
    }

    ...
}

task jacocoTestReport(type: JacocoReport) {
    dependsOn 'createDebugCoverageReport'
    dependsOn 'testDebugUnitTest'

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

    jacocoClasspath = configurations['androidJacocoAnt']

    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"
    print("${project.projectDir}/src/main/java")

    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = fileTree(dir: "$buildDir", includes: [
            "jacoco/testDebugUnitTest.exec",
            "outputs/code-coverage/connected/*coverage.ec"
    ])
}

用不同的插件版本比较 gradle dependencies 的输出,似乎

jacocoClasspath = configurations['androidJacocoAnt']

需要改为

jacocoClasspath = configurations['jacocoAnt']

您需要最新的 JaCoCo 8.1 Android Gradle 插件 3.1 或更高版本吗?

问题出在 gradle 插件中,其中 JaCoCo 的版本被硬编码为 0.7.9

解决方法(第 1 步到第 2 步):添加到根 build.gradle

buildscript {
    ext {
        jacocoVersion = project.JACOCO_VERSION
    }
    dependencies {
        /* To confirm JaCoCo version run: $ ./gradlew buildEnvironment */
        //region classpath "org.jacoco:org.jacoco.core:${jacocoVersion}"
        /* Resolves issue of incorrect version use in one of jacoco/android plugin inner tasks */
        classpath "org.jacoco:org.jacoco.core:${jacocoVersion}"
        classpath "org.jacoco:org.jacoco.report:${jacocoVersion}"
        classpath "org.jacoco:org.jacoco.agent:${jacocoVersion}"
        //endregion
    }
}

解决方法(第 2 步中的第 2 步):添加到根 build.gradle

/* Force Jacoco Agent version upgrade */
subprojects {
    configurations.all {
        resolutionStrategy {
            eachDependency { details ->
                if ('org.jacoco' == details.requested.group) {
                    details.useVersion "${jacocoVersion}"
                }
            }
        }
    }
}

尽情享受