androidandroid-studiogradlespotbugs

Minimal working SpotBugs setup for Android Studio


How do I set up SpotBugs for Android?

I tried following the official documentation and that of the gradle plugin, but the setup for Android is incomplete and confusing, and didn't work.

I tried the following setup.

build.gradle (project):

buildscript {
  repositories {
    // ...
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    // ...
    classpath "gradle.plugin.com.github.spotbugs:spotbugs-gradle-plugin:1.6.4"
  }
}

build.gradle (app):

//...
apply plugin: "com.github.spotbugs"

android {
  // ...
  sourceSets {
    main {
      java.srcDirs = ['src/main/java']
    }
  }
}

// ...

spotbugs {
    toolVersion = "3.1.3"
    ignoreFailures = true
    reportsDir = file("$project.buildDir/findbugsReports")
    effort = "max"
    reportLevel = "high"
}

tasks.withType(com.github.spotbugs.SpotBugsTask) {
  // What do I need to do here?
}

I tried running it with ./gradlew spotbugsMain, but the gradle task is missing.
Am I supposed to add the task manually? How do I do that?

Could you show me an example of a minimal working setup for an Android project?


Solution

  • I made some tests on my side and I manage to make it work like this :

    1) Move the sourceSets declaration outside the android block. Leave it empty, it's just for the spotbugsMain task generation, it won't impact the global Android build.

    android {
       // ...
    }
    
    sourceSets {
        main {
            java.srcDirs = []
        }
    }
    

    2) Keep your spotbugs block and configure the SpotBugsTask tasks like this :

    tasks.withType(com.github.spotbugs.SpotBugsTask) {
        classes = files("$projectDir.absolutePath/build/intermediates/classes/debug")
        source = fileTree('src/main/java')
    }
    

    It will generate reports in app/build/findbugsReports

    Important :

    It only works with the ./gradlew build command, ./gradlew spotbugsMain won't work as the project must be built before

    You can fix that adding an assemble dependency :

    tasks.withType(com.github.spotbugs.SpotBugsTask) {
        dependsOn 'assemble'
        classes = files("$projectDir.absolutePath/build/intermediates/classes/debug")
        source = fileTree('src/main/java')
    }