android - Jacoco gradle 'exclude'无法在Kotlin的Android项目中使用

标签 android android-studio gradle kotlin jacoco

我在Android Studio中有一个使用kotlin的Android项目,并想使用Jacoco报告代码测试范围。我正在使用Dagger,并且希望将这些类从报告中排除。但是,使用excludes不会执行任何操作,并且在尝试运行Jacoco任务有关应排除的文件时出现错误。以下是我的jacoco.gradle文件。

apply plugin: 'jacoco'

jacoco {
    toolVersion = "$versions.jacoco_version"
}

project.afterEvaluate {
    // Grab all build types and product flavors
    def buildTypes = android.buildTypes.collect { type -> type.name }
    def productFlavors = android.productFlavors.collect { flavor -> flavor.name }

// When no product flavors defined, use empty
if (!productFlavors) productFlavors.add('')

productFlavors.each { productFlavorName ->
    buildTypes.each { buildTypeName ->
        def sourceName, sourcePath
        if (!productFlavorName) {
            sourceName = sourcePath = "${buildTypeName}"
        } else {
            sourceName = "${productFlavorName}${buildTypeName.capitalize()}"
            sourcePath = "${productFlavorName}/${buildTypeName}"
        }
        def testTaskName = "test${sourceName.capitalize()}UnitTest"

        // Create coverage task of form 'testFlavorTypeCoverage' depending on 'testFlavorTypeUnitTest'
        task "${testTaskName}Coverage" (type:JacocoReport, dependsOn: "$testTaskName") {
            group = "Reporting"
            description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build."

            classDirectories = fileTree(
                    dir: "${project.buildDir}/tmp/kotlin-classes/${sourcePath}",
                    excludes: ['**/R.class',
                               '**/R$*.class',
                               '**/*$ViewInjector*.*',
                               '**/*$ViewBinder*.*',
                               '**/BuildConfig.*',
                               '**/Manifest*.*',
                               '**/*_MembersInjector.*',
                               '**/Dagger*Component.*',
                               '**/Dagger*Subcomponent.*',
                               '**/*Subcomponent$Builder.*',
                               '**/*Module_*Factory.*']
            )

            def coverageSourceDirs = [
                    "src/main/java",
                    "src/$productFlavorName/java",
                    "src/$buildTypeName/java"
            ]
            additionalSourceDirs = files(coverageSourceDirs)
            sourceDirectories = files(coverageSourceDirs)
            executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")

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

这是一个错误示例:
/***/***/StudioProjects/***/app/build/generated/source/kapt/debug/com/***/***/App_MembersInjector.java:9: error: cannot find symbol
@Generated(
 ^
  symbol: class Generated

该文件应被排除,但不是。

更新:

经过进一步的调查,似乎是由于我尝试从不涉及jacoco的终端上简单运行测试而引起的错误,因此可能比这更深。

最佳答案

我像这样使用并且像魅力一样工作:

task "${testTaskName}Coverage" (type:JacocoReport,
      dependsOn: ["$testTaskName"]
  ) {
    group = "Reporting"
    description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build."
def excludes = [
        '**/R.class',
        '**/R$*.class',
        '**/Manifest*.*',
        'android/**/*.*',
        '**/BuildConfig.*',
        '**/*$ViewBinder*.*',
        '**/*$ViewInjector*.*',
        '**/Lambda$*.class',
        '**/Lambda.class',
        '**/*Lambda.class',
        '**/*Lambda*.class',
        '**/*Module.*',
        '**/*Dagger*.*',
        '**/*_MembersInjector.class',
        '**/Dagger*Component*.class',
        '**/Dagger*Subcomponent*.class',
        '**/*Subcomponent$Builder.class',
        '**/*Module_*Factory.class',
        '**/*MyCustomStuff*.*'
    ]

    classDirectories.from = fileTree(
        dir: "${project.buildDir}/intermediates/classes/${sourcePath}",
        excludes: excludes
    ) + fileTree(
        dir: "${project.buildDir}/tmp/kotlin-classes/${sourceName}",
        excludes: excludes
    )

def coverageSourceDirs = [
        "src/main/java",
        "src/$productFlavorName/java",
        "src/$buildTypeName/java"
    ]
    additionalSourceDirs.from = files(coverageSourceDirs)
    sourceDirectories.from = files(coverageSourceDirs)
    executionData.from = files([
        "${project.buildDir}/jacoco/${testTaskName}.exec"
    ])
}

关于android - Jacoco gradle 'exclude'无法在Kotlin的Android项目中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166432/

相关文章:

android - 轮换后更改服务的第二个实例

android - 为android测试任务生成xml报告

渐变 wsimport

gradle - 为Gradle任务属性提供派生默认值的正确方法

android - 无法在Android Studio 2.3.3中创建新项目

java - 如何从以下 json 数组解析或创建 pojo?

java - 如何知道 Android 设备是否平放在 table 上

java - 如何在 Android Studio 中创建项目特定的文件模板?

android - 尝试将 Gradle 项目导入 Android Studio 现有项目时出错

java - 在同时处理多项任务时,如何防止我的 Activity 变成垃圾?