Android Jacoco显示0%的覆盖率,即使100%的测试通过

Android Jacoco显示0%的覆盖率,即使100%的测试通过,android,kotlin,gradle,jacoco,Android,Kotlin,Gradle,Jacoco,我一直在kotlin从事一个android项目,在那里我有几个软件包:app,package1,package2,package3每个软件包都有自己的build.gradle像build.gradle在相应的软件包中,app,package1,package2,package3。 还有一个顶级的build.gradle。现在每个包都有一个src和一个tests文件夹。现在,我在package.root中创建了一个jacoco.gradle文件。并从每个包的build.gradle中的“$proj

我一直在kotlin从事一个android项目,在那里我有几个软件包:
app
package1
package2
package3
每个软件包都有自己的
build.gradle
build.gradle
在相应的软件包中,app,package1,package2,package3。 还有一个顶级的
build.gradle
。现在每个包都有一个src和一个tests文件夹。现在,我在
package.root
中创建了一个
jacoco.gradle
文件。并从每个包的
build.gradle
中的“$project.rootDir/jacoco.gradle”应用
apply。
这是我的
jacoco.gradle
文件供参考

apply plugin: 'jacoco'


jacoco {
  toolVersion = "0.8.6"
}

tasks.withType(Test) {
  jacoco.includeNoLocationClasses = true
  jacoco.excludes = ['jdk.internal.*']
}
project.afterEvaluate {

  (android.hasProperty('applicationVariants')
      ? android.'applicationVariants'
      : android.'libraryVariants').all { variant ->
    def variantName = variant.name
    def unitTestTask = "test${variantName.capitalize()}UnitTest"
    def uiTestCoverageTask = "create${variantName.capitalize()}CoverageReport"

    tasks.create(name: "${unitTestTask}Coverage", type: JacocoReport, dependsOn: [
        "$unitTestTask",
        "$uiTestCoverageTask"
    ]) {
      group = "Reporting"
      description = "Generate Jacoco coverage reports for the ${variantName.capitalize()} build"

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

      def fileFilter = [
          // data binding
          'android/databinding/**/*.class',
          '**/android/databinding/*Binding.class',
          '**/android/databinding/*',
          '**/androidx/databinding/*',
          '**/BR.*',
          // android
          '**/R.class',
          '**/R$*.class',
          '**/BuildConfig.*',
          '**/Manifest*.*',
          '**/*Test*.*',
          'android/**/*.*',
          // kotlin
          '**/*MapperImpl*.*',
          '**/*$ViewInjector*.*',
          '**/*$ViewBinder*.*',
          '**/BuildConfig.*',
          '**/*Component*.*',
          '**/*BR*.*',
          '**/Manifest*.*',
          '**/*$Lambda$*.*',
          '**/*Companion*.*',
          '**/*Module*.*',
          '**/*Dagger*.*',
          '**/*MembersInjector*.*',
          '**/*_MembersInjector.class',
          '**/*_Factory*.*',
          '**/*_Provide*Factory*.*',
          '**/*Extensions*.*',
          // sealed and data classes
          '**/*$Result.*',
          '**/*$Result$*.*'
      ]

      classDirectories.setFrom(files([
          fileTree(dir: "${buildDir}/tmp/kotlin-classes/${variantName}", excludes: fileFilter)
      ]))

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


      def uiTestsData = fileTree(dir: "${buildDir}/outputs/code_coverage/${variantName}AndroidTest/connected/", includes: ["**/*.ec"])

      executionData(files([
          "$project.buildDir/jacoco/${unitTestTask}.exec",
          uiTestsData
      ]))
    }
  }
}
现在的问题是,当我运行
testDebugUnitTestCoverage
任务时,即使包中的所有测试都通过了,结果显示代码覆盖率为0%,并且所有行都丢失了。有人能帮我找到解决办法吗

更新 使用
app
package和
package2
(在任何文件中没有任何更改)报告覆盖范围,但jacoco仍然报告
package1
package3
0覆盖范围

编辑 为失败包中的1个添加了渐变文件

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply from: "$project.rootDir/jacoco.gradle"

android {
  compileSdkVersion 29
  buildToolsVersion "29.0.2"

  defaultConfig {
    minSdkVersion 19
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
    javaCompileOptions {
      annotationProcessorOptions {
        includeCompileClasspath true
      }
    }
  }

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

  kotlinOptions {
    jvmTarget = JavaVersion.VERSION_1_8
  }

  testOptions {
    unitTests {
      includeAndroidResources = true
      all {
   
        forkEvery = 1
        maxParallelForks = Runtime.getRuntime().availableProcessors()

        testLogging {
          events "passed", "skipped", "failed"
          showExceptions = true
          exceptionFormat = "full"
          showCauses = true
          showStackTraces = true
          showStandardStreams = false
        }
      }
    }
  }

  buildTypes {
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
      testCoverageEnabled true
    }
  }
}

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  implementation(
      'androidx.appcompat:appcompat:1.0.2',
      'androidx.exifinterface:exifinterface:1.0.0-rc01',
      'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha03',
      'androidx.work:work-runtime-ktx:2.4.0',
      'com.google.dagger:dagger:2.24',
      'com.google.firebase:firebase-analytics-ktx:17.5.0',
      'com.google.firebase:firebase-crashlytics:17.0.0',
      "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
  )
  testImplementation(
      'android.arch.core:core-testing:1.1.1',
      'androidx.test.espresso:espresso-core:3.2.0',
      'androidx.test.ext:junit:1.1.1',
      'androidx.work:work-testing:2.4.0',
      'com.google.dagger:dagger:2.24',
      'com.google.truth:truth:0.43',
      'junit:junit:4.12',
      "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version",
      'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.2',
      'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.2.2',
      'org.mockito:mockito-core:2.19.0',
      'org.robolectric:robolectric:4.3',
      project(":package2"),
  )
  kapt(
      'com.google.dagger:dagger-compiler:2.24',
  )
  kaptTest(
      'com.google.dagger:dagger-compiler:2.24',
  )

  api project(':package1')
  implementation project(':package4')
  implementation project(':package3')
}
repositories {
  mavenCentral()
}

configurations {
  all*.exclude module: 'protobuf-java'
}
更新
当我在android studio的运行配置中运行覆盖率时,我得到了正确的数据,但当我在gradle tasks中运行覆盖率时,它显示为0。

你在kotlin代码中使用了协同路由吗?是的,我在代码中使用了协同路由。