apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'jacoco' apply plugin: 'com.github.kt3k.coveralls' buildscript { repositories { mavenCentral() } dependencies { classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:+' } } def androidModule = project(':app') def firstVariant = androidModule.android.applicationVariants.toList().first() dependencies { compile androidModule testCompile firstVariant.javaCompile.classpath testCompile firstVariant.javaCompile.outputs.files testCompile files(androidModule.plugins.findPlugin("com.android.application").getBootClasspath()) testCompile 'junit:junit:4.+' testCompile 'org.robolectric:robolectric:+' } jacocoTestReport { /* Alright, setting up Jacoco the right way is massively confusing. Normally, you'd use something like additionalClassDirs to add the folders you need. However, we want to exclude the android/ folder, and likely will need something else in the future. In order to do this though, we need the doFirst block. See SO here: http://stackoverflow.com/a/17411305/1454178 Additionally, to properly exclude, we need to run that code outside the doFirst block. No clue why this is, but please don't change this without extensive testing. */ def jacocoExcludes = [ "android/**/*" ] firstVariant.javaCompile.exclude(jacocoExcludes).outputs.files doFirst { sourceDirectories = files(androidModule.android.sourceSets.main.java.srcDirs) classDirectories = firstVariant.javaCompile.outputs.files } // Back to your regularly scheduled Jacoco reports { xml.enabled true csv.enabled false html.destination "${buildDir}/jacocoHtml" } } coveralls { sourceDirs = files(androidModule.android.sourceSets.main.java.srcDirs).files.absolutePath }