Findbugs Android Gradle插件

9

我有一个安卓项目。我想引入findbugs作为Gradle插件。我尝试编辑项目的build.gradle文件如下。

buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://maven.fabric.io/public' }
           }
dependencies {
    classpath 'com.android.tools.build:gradle:1.0.0+'
    classpath 'io.fabric.tools:gradle:1.+'

    }
}

apply plugin: "java"
apply plugin: "findbugs"
findbugs {
  toolVersion = "2.0.1"
  sourceSets = [sourceSets.main]
  ignoreFailures = false
  reportsDir = file("$project.buildDir/findbugsReports")
  effort = "max"
  reportLevel = "high"
  includeFilter =     file("$rootProject.projectDir/config/findbugs/includeFilter.xml")
  excludeFilter = file("$rootProject.projectDir/config/findbugs/excludeFilter.xml")
 }

这个插件正确吗?是否需要添加或删除任何内容?那么,我该怎么获取findbugs检查的结果?应该使用什么gradle命令?


点击“立即同步”以更新Gradle。 - Sukumar Nagarajan
@sukumar 实际上我想要一个命令来调用它,因为这是持续集成的一部分。同步成功了。零错误和零警告。插件看起来还好吗? - Nevin Raj Victor
1
https://androidbycode.wordpress.com/2015/02/13/static-code-analysis-automation-using-findbugs-android-studio/ - Sukumar Nagarajan
4个回答

16

将以下内容放入您的模块build.gradle文件中即可。

apply plugin: 'findbugs'

task customFindbugs(type: FindBugs) {
    ignoreFailures = false
    effort = "max"
    reportLevel = "low"
    classes = files("$project.buildDir/intermediates/classes")

    // Use this only if you want exclude some errors
    excludeFilter = file("$rootProject.rootDir/config/findbugs/exclude.xml")

    source = fileTree('src/main/java/')
    classpath = files()

    reports {
        xml.enabled = false
        xml.withMessages = true
        html.enabled = !xml.isEnabled()
        xml.destination "$project.buildDir/outputs/findbugs/findbugs-output.xml"
        html.destination "$project.buildDir/outputs/findbugs/findbugs-output.html"
    }
}

build.dependsOn customFindbugs

在命令行中切换到您的项目路径后,使用以下命令:

./gradlew build

错误报告将在$project.buildDir/outputs/findbugs/findbugs-output.html中。


10

我稍微修改了Nevin Raj Victor的答案。

这个版本为每个构建变体生成一个findbug任务,而且(更重要的是),它正确地在各自的编译任务上创建了依赖关系。事实上,findbugs需要代码在分析之前被编译。

// findbug tasks for each variant
apply plugin: 'findbugs'

android.applicationVariants.all { variant ->
    task("findbugs${variant.name.capitalize()}", type: FindBugs) {
        description "Analyze ${variant.name} code with the findbugs tool"
        group "Verification"

        ignoreFailures = true
        effort = "default"
        reportLevel = "medium"

        classes = files("$project.buildDir/intermediates/classes/${variant.dirName}")
        excludeFilter = file("$rootProject.rootDir/findbugs/findbugs-filter.xml")
        source = variant.javaCompile.source
        classpath = variant.javaCompile.classpath

        reports {
            // Only one of HTML or XML can be turned on at the same time
            html.enabled = true
            xml.enabled = !html.enabled
            xml.withMessages = true

            html.destination = "$project.buildDir/outputs/findbugs/findbugs-${variant.name}-output.html"
            xml.destination = "$project.buildDir/outputs/findbugs/findbugs-${variant.name}-output.xml"
        }

        dependsOn "compile${variant.name.capitalize()}JavaWithJavac"
    }
}

完成此操作后,您可以运行

./gradlew findbugsDebug
./gradlew findbugsRelease

或者根据你的配置,在不同的变体上执行其他FindBugs任务。


1

0

我看到你的配置有一些问题:

  • 使用最新的3.0.1版本,而不是2.0.1版本
  • reportLevel设置为low,以报告所有违规情况,而不是high
  • 对于第一次分析,您不需要配置任何includeFilterexcludeFilter - 这些仅是检查白名单和黑名单,如果您需要一些自定义,则可以使用它们

要运行分析,请调用gradle findbugsMain。结果应该在输出中可见。


Kordas:插件现在似乎运行良好,因为./gradlew findbugsMain正在执行。但我找不到指定文件夹中的任何日志。 - Nevin Raj Victor
你确定build/findbugsReports目录下没有任何文件吗? - Michal Kordas
Kordas:未生成“build/findbugsReport”目录。 - Nevin Raj Victor
所以可能你在[sourceSets.main]中没有任何内容。你可以尝试在没有sourceSets属性或者不同的值下运行吗? - Michal Kordas
你可以尝试像这样编写代码:subprojects { apply plugin: 'findbugs' findbugs { toolVersion = '3.0.1' } },然后每个模块都会在 build\reports\findbugs\main.xml 中生成报告。 - Michal Kordas
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接