Android Studio 的最小工作 SpotBugs 设置
Minimal working SpotBugs setup for Android Studio
如何为 Android 设置 SpotBugs?
我尝试遵循 official documentation and that of the gradle plugin,但是 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 项目的最小工作设置示例?
我自己做了一些测试,我设法让它像这样工作:
1) 将 sourceSets
声明移到 android
块之外。留空,仅用于 spotbugsMain
任务生成,不会影响全局 [=38=] 构建。
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 回答(2018 年 10 月 9 日)之后;将此用于 Android Studio 3.4 及更高版本:
project/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"
}
}
project/app/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 fails with "java.io.IOException: No files to analyze could be opened"
您还需要启用 HTML 报告并禁用 XML 报告,才能看到 human-readable 格式。
ignoreFailures = true
是可选的。当 SpotBugs 检测到代码警告时,默认情况下它将以 "BUILD FAILED"
+ 报告文件结尾。设置 ignoreFailures = true
意味着 gradle 任务将以 "BUILD SUCCESSFUL"
+ 报告文件结束。
要从分析中排除一些生成的 类,请设置一个 excludeFilter
。对于示例排除文件,请检查 here or here (same as findbugs-exclude.xml)
更多信息和教程在这里:https://mikedemaso.com/tech/2020-06-10-spotbugs-gradle-plugin-android/
如何为 Android 设置 SpotBugs?
我尝试遵循 official documentation and that of the gradle plugin,但是 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 项目的最小工作设置示例?
我自己做了一些测试,我设法让它像这样工作:
1) 将 sourceSets
声明移到 android
块之外。留空,仅用于 spotbugsMain
任务生成,不会影响全局 [=38=] 构建。
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 回答(2018 年 10 月 9 日)之后;将此用于 Android Studio 3.4 及更高版本:
project/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"
}
}
project/app/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 fails with "java.io.IOException: No files to analyze could be opened"
您还需要启用 HTML 报告并禁用 XML 报告,才能看到 human-readable 格式。
ignoreFailures = true
是可选的。当 SpotBugs 检测到代码警告时,默认情况下它将以 "BUILD FAILED"
+ 报告文件结尾。设置 ignoreFailures = true
意味着 gradle 任务将以 "BUILD SUCCESSFUL"
+ 报告文件结束。
要从分析中排除一些生成的 类,请设置一个 excludeFilter
。对于示例排除文件,请检查 here or here (same as findbugs-exclude.xml)
更多信息和教程在这里:https://mikedemaso.com/tech/2020-06-10-spotbugs-gradle-plugin-android/