Loading app/build.gradle +70 −1 Original line number Diff line number Diff line Loading @@ -9,6 +9,11 @@ plugins { id 'com.google.dagger.hilt.android' id 'kotlin-allopen' id 'kotlin-parcelize' id 'jacoco' } jacoco { toolVersion = libs.versions.jacoco.get() } def versionMajor = 2 Loading Loading @@ -42,6 +47,30 @@ def getSentryDsn = { -> return properties.getProperty('SENTRY_DSN') } def jacocoFileFilter = [ '**/R.class', '**/R$*', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', '**/*_ViewBinding*.*', '**/*Binding.class', '**/*BindingImpl.class', '**/Dagger*.*', '**/*MembersInjector*.*', '**/*_Factory*.*', '**/*_Provide*Factory*.*', '**/*_GeneratedInjector*.*', '**/*Hilt*.*' ] tasks.withType(Test).configureEach { jacoco { includeNoLocationClasses = true excludes = ['jdk.internal.*'] } } android { compileSdk = 35 Loading Loading @@ -166,6 +195,47 @@ android { } } android.applicationVariants.configureEach { variant -> def variantCap = variant.name.capitalize() def unitTestTaskName = "test${variantCap}UnitTest" def unitTestTask = tasks.findByName(unitTestTaskName) if (unitTestTask == null) { return } tasks.register("jacoco${variantCap}Report", JacocoReport) { dependsOn(unitTestTask) group = "verification" description = "Generates Jacoco coverage report for the ${variant.name} build." reports { xml.required = true html.required = true } def javaClasses = fileTree("${buildDir}/intermediates/javac/${variant.name}/classes") { exclude jacocoFileFilter } def kotlinClasses = fileTree("${buildDir}/tmp/kotlin-classes/${variant.name}") { exclude jacocoFileFilter } classDirectories.from = files(javaClasses, kotlinClasses) def sourceDirs = variant.sourceSets.collect { sourceSet -> def dirs = [] dirs.addAll(sourceSet.java.srcDirs) if (sourceSet.hasProperty('kotlin')) { dirs.addAll(sourceSet.kotlin.srcDirs) } return dirs }.flatten() sourceDirectories.from = files(sourceDirs) executionData.from = file("${buildDir}/jacoco/${unitTestTaskName}.exec") } } allOpen { // allows mocking for classes w/o directly opening them for release builds annotation 'foundation.e.apps.OpenClass' Loading Loading @@ -280,4 +350,3 @@ def retrieveKey(String keyName, String defaultValue) { return properties.getProperty(keyName, defaultValue) } gradle/libs.versions.toml +1 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ jacksonDataformatYaml = "2.17.0" jsoup = "1.17.2" junit = "4.13.2" junitVersion = "1.2.1" jacoco = "0.8.11" kotlin = "2.1.0" hilt = "2.54" kotlinxCoroutinesAndroid = "1.10.1" Loading Loading
app/build.gradle +70 −1 Original line number Diff line number Diff line Loading @@ -9,6 +9,11 @@ plugins { id 'com.google.dagger.hilt.android' id 'kotlin-allopen' id 'kotlin-parcelize' id 'jacoco' } jacoco { toolVersion = libs.versions.jacoco.get() } def versionMajor = 2 Loading Loading @@ -42,6 +47,30 @@ def getSentryDsn = { -> return properties.getProperty('SENTRY_DSN') } def jacocoFileFilter = [ '**/R.class', '**/R$*', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', '**/*_ViewBinding*.*', '**/*Binding.class', '**/*BindingImpl.class', '**/Dagger*.*', '**/*MembersInjector*.*', '**/*_Factory*.*', '**/*_Provide*Factory*.*', '**/*_GeneratedInjector*.*', '**/*Hilt*.*' ] tasks.withType(Test).configureEach { jacoco { includeNoLocationClasses = true excludes = ['jdk.internal.*'] } } android { compileSdk = 35 Loading Loading @@ -166,6 +195,47 @@ android { } } android.applicationVariants.configureEach { variant -> def variantCap = variant.name.capitalize() def unitTestTaskName = "test${variantCap}UnitTest" def unitTestTask = tasks.findByName(unitTestTaskName) if (unitTestTask == null) { return } tasks.register("jacoco${variantCap}Report", JacocoReport) { dependsOn(unitTestTask) group = "verification" description = "Generates Jacoco coverage report for the ${variant.name} build." reports { xml.required = true html.required = true } def javaClasses = fileTree("${buildDir}/intermediates/javac/${variant.name}/classes") { exclude jacocoFileFilter } def kotlinClasses = fileTree("${buildDir}/tmp/kotlin-classes/${variant.name}") { exclude jacocoFileFilter } classDirectories.from = files(javaClasses, kotlinClasses) def sourceDirs = variant.sourceSets.collect { sourceSet -> def dirs = [] dirs.addAll(sourceSet.java.srcDirs) if (sourceSet.hasProperty('kotlin')) { dirs.addAll(sourceSet.kotlin.srcDirs) } return dirs }.flatten() sourceDirectories.from = files(sourceDirs) executionData.from = file("${buildDir}/jacoco/${unitTestTaskName}.exec") } } allOpen { // allows mocking for classes w/o directly opening them for release builds annotation 'foundation.e.apps.OpenClass' Loading Loading @@ -280,4 +350,3 @@ def retrieveKey(String keyName, String defaultValue) { return properties.getProperty(keyName, defaultValue) }
gradle/libs.versions.toml +1 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ jacksonDataformatYaml = "2.17.0" jsoup = "1.17.2" junit = "4.13.2" junitVersion = "1.2.1" jacoco = "0.8.11" kotlin = "2.1.0" hilt = "2.54" kotlinxCoroutinesAndroid = "1.10.1" Loading