Как настроить 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 Ваш вопрос кажется мне совершенно нормальным, и я не понимаю, почему кто-то не проголосовал за него. Еще более странным является то, что два человека проголосовали за закрытие вопроса о том, как настроить SpotBugs для Android как «не по теме»!
Вот пример: gist.github.com/mik9/fdde79052fef7f03c4325734701a39d7
Я провел несколько тестов на своей стороне, и мне удалось заставить его работать следующим образом:
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 и выше:
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"
}
}
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/
Если бы те, кто проголосовал против, сказали мне, почему, я мог бы улучшить вопрос.