Минимальная рабочая установка SpotBugs для Android Studio

Как настроить SpotBugs для Android?

Я пробовал следовать официальная документация и плагин gradle, но настройка для Android неполная, запутанная и не сработала.

Я попробовал следующую настройку.

build.gradle (проект):

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

build.gradle (приложение):

//...
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?
}

Я попытался запустить его с ./gradlew spotbugsMain, но задача gradle отсутствует. Могу ли я добавить задачу вручную? Как я могу это сделать?

Не могли бы вы показать мне пример минимальной рабочей установки для Android-проекта?

Если бы те, кто проголосовал против, сказали мне, почему, я мог бы улучшить вопрос.

Terry 04.10.2018 19:25

@Terry Ваш вопрос кажется мне совершенно нормальным, и я не понимаю, почему кто-то не проголосовал за него. Еще более странным является то, что два человека проголосовали за закрытие вопроса о том, как настроить SpotBugs для Android как «не по теме»!

skomisa 09.10.2018 02:25

Вот пример: gist.github.com/mik9/fdde79052fef7f03c4325734701a39d7

dskrvk 18.12.2018 23:40
25
3
5 131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я провел несколько тестов на своей стороне, и мне удалось заставить его работать следующим образом:

1) Переместите объявление sourceSets за пределы блока android. Оставьте поле пустым, это только для генерации задачи spotbugsMain, это не повлияет на глобальную сборку Android.

android {
   // ...
}

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

2) Сохраните свой блок spotbugs и настройте задачи SpotBugsTask следующим образом:

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

Он будет генерировать отчеты в app/build/findbugsReports

Важный :

Он работает только с командой ./gradlew build, ./gradlew spotbugsMain не будет работать, так как проект должен быть собран раньше.

Вы можете исправить это, добавив зависимость assemble:

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

Следуя ответу ToYonos (9 октября 2018 г.); Используйте это для Android Studio 3.4 и выше:

проект / build.gradle

buildscript {
    repositories {
        google()
        jcenter()
        maven {
            url 'https:// maven url 1'
        }
        maven {
            url "https://plugins.gradle.org/m2/" // Add this, for SpotBugs
        }
    }
    dependencies {
        classpath '...'

        // If you're using gradle 6.x, add this to use SpotBugs app version 4.0.2
        classpath "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.3.0"

        // If you're using gradle 4.x or 5.x, add this to use SpotBugs app version 3.1.2
        classpath "com.github.spotbugs:spotbugs-gradle-plugin:2.0.1" 
    }
}

проект / приложение / build.gradle

apply plugin: 'com.android.application'
apply plugin: '...'
apply plugin: "com.github.spotbugs" // <- Add this
    
dependencies {
    ...
}

// This block is only needed for gradle 4/5 only.
// It's for SpotBugs to create a 'spotbugsMain' gradle task.
sourceSets {
    main {
        java.srcDirs = []
    }
}
    
spotbugs {
    ignoreFailures = true
    reportsDir = file("$project.buildDir/SpotBugsReports")
    effort = "max"
    reportLevel = "high"
}

// Note: gradle 4/5 should use "com.github.spotbugs.SpotBugsTask"
tasks.withType(com.github.spotbugs.snom.SpotBugsTask) {
    dependsOn 'assembleDebug'
    classes = files("$project.buildDir/intermediates/javac") // Important to use this path
    excludeFilter = file("$project/spot-bugs-exclude.xml") // Optional - Explained below
    source = fileTree('src/main/java') // Only needed on gradle 4/5
    reports {
        // Enable HTML report only
        html.enabled = true
        xml.enabled = false
    }
}

Вы можете создать отчет для своей отладочной сборки, выполнив задачу gradle:

For gradle 6.x: ./gradlew spotbugsDebug

For gradle 5 or 4: ./gradlew spotbugsMain

Важно использовать classes = files("$project.buildDir/intermediates/javac"), иначе вы получите ошибку "java.io.IOException: No files to analyze could be opened" - см. Ошибка Findbugs: «java.io.IOException: файлы для анализа не открываются»

Вам также необходимо включить отчет HTML и отключить отчет XML, чтобы увидеть формат, удобочитаемый человеком.

ignoreFailures = true не является обязательным. Когда SpotBugs обнаруживает кодовое предупреждение, по умолчанию оно заканчивается "BUILD FAILED" + файлом отчета. Установка ignoreFailures = true означает, что задача gradle завершится "BUILD SUCCESSFUL" + файлом отчета.

Чтобы исключить некоторые сгенерированные классы из анализа, настройте excludeFilter. Для примера файла исключения отметьте здесь или здесь (то же, что и findbugs-exclude.xml)

Дополнительная информация и руководство здесь: https://mikedemaso.com/tech/2020-06-10-spotbugs-gradle-plugin-android/

Другие вопросы по теме