apply plugin: 'jacoco' jacoco { toolVersion = "$jacoco_version" } // Force Jacoco Version subprojects { configurations.all { resolutionStrategy { eachDependency { details -> if ('org.jacoco' == details.requested.group) { details.useVersion "$jacocoVersion" } } } } } project.afterEvaluate { project -> tasks.withType(Test) { jacoco.includeNoLocationClasses = true jacoco.excludes = ['jdk.internal.*'] } final flavor = "Gplay" final buildType = "Debug" final variant = "$flavor${buildType.capitalize()}" final taskName = "jacocoTest${variant.capitalize()}UnitTestReport" task "$taskName"(type: JacocoReport, dependsOn: "test${variant.capitalize()}UnitTest") { reports { csv.required = Boolean.FALSE xml.required = Boolean.TRUE html.required = Boolean.TRUE } final fileFilter = [ // data binding '**/databinding/*', '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*.*', '**/*Hilt*.*', '**/*MembersInjector*.*', '**/*_MembersInjector.class', '**/*_Factory*.*', '**/*_Provide*Factory*.*', '**/*Extensions*.*', // sealed and data classes '**/*$Result.*', '**/*$Result$*.*', // adapters generated by moshi '**/*JsonAdapter.*', // Hilt '**/*Module.kt', '**/di/**', 'dagger.hilt.internal/*', 'hilt_aggregated_deps/*', '**/*$Result.*', /* filtering `sealed` and `data` classes */ '**/*$Result$*.*',/* filtering `sealed` and `data` classes */ '**/*Args*.*', /* filtering Navigation Component generated classes */ '**/*Directions*.*', /* filtering Navigation Component generated classes */ '**/*inlined*.class', /* filtering inlined classes */ '**/composables/**' /* INSERT ANY OTHER JUNK YOU WANT FILTERED OUT HERE */ ] final androidKotlinTree = fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/${variant}", excludes: fileFilter) final kotlinTree = fileTree(dir: "${project.buildDir}/classes/kotlin/main", excludes: fileFilter) final javacTree = fileTree(dir: "${project.buildDir}/intermediates/javac/${variant}/classes", excludes: fileFilter) final mainSrc = "${project.projectDir}/src/main/java" final productFlavorSrc = "${project.projectDir}/src/${flavor}/java" final buildTypeSrc = "${project.projectDir}/src/${buildType}/java" sourceDirectories.setFrom files([mainSrc, productFlavorSrc, buildTypeSrc]) classDirectories.setFrom files([androidKotlinTree, kotlinTree, javacTree]) executionData.setFrom fileTree(dir: project.buildDir, includes: [ "jacoco/test${variant.capitalize()}UnitTest.exec", "outputs/unit_test_code_coverage/${variant}UnitTest/test${variant.capitalize()}UnitTest.exec", ]) } }