如何提高android代码的质量(CheckStyle、Findbugs、PMD、Lint)

  • Post author:
  • Post category:其他


为了保证团队开发中代码的规范,我们往往需要一些工具来进行严格的规范检查,下面将要介绍的四个工具是我们在Android开发中往往会用到的,这些工具只需要在Android Studio中的Gradle构建脚本中进行配置就可以了。


一、下载案例


通过案例代码可以对这些工具进行测试和了解,下载链接:

https://github.com/vincentbrison/vb-android-app-quality

项目结构:

gradle脚本被分离在几个文件中:

1、根目录下的gradle文件

如下图所说,在根目录中有一个build.gradle文件。从这个文件所在的位置也可以看出,它是关于整个项目的配置。

这里写图片描述

2、app目录下的gradle文件

如下图所示,在app目录下有一个build.gradle文件,它是构建整个Android应用的配置文件。

这里写图片描述

3、config目录下的gradle文件

如下图所示,在config目录有一个quality.gradle文件,这个文件就是本文要讨论的重点,它里面保存和配置了这个项目所要使用到的工具。从config目录下的quality目录下的几个目录可以看到checkstyle、findbugs、lint、pmd这几个工具的所定义的规则文件。

这里写图片描述


二、工具介绍


1、CheckStyle

这个工具用来自动检测java代码,。当启动CheckStyke,它就可以对你的java代码进行检查并且将所有的错误通知给你。

下面的代码就表示项目中使用CheckSytle。它被配置在上面的config目录下的gradle文件中。

task checkstyle(type: Checkstyle) {
    configFile file("${project.rootDir}/config/quality/checkstyle/checkstyle.xml")
    configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath
    source 'src'
    include '**/*.java'
    exclude '**/gen/**'
    classpath = files()
}

从这个代码中可以看到,它是一个任务,这个任务就可以根据checkstyle.xml和suppressions.xml这两个文件定义的规则来检测你的java代码。

运行checkstyle之后,它就会生成一个报告,这个报告描述了它在你的项目中所找到的所有问题。

关于checkstyle的更多配置,可以参看它的说明文档:

https://docs.gradle.org/current/dsl/org.gradle.api.plugins.quality.Checkstyle.html

2、Findbugs

Findbugs使用静态分析来检测java字节码中发现的错误模式。所以它分析的是程序的字节码,它不仅可以检测出一些普遍的错误,例如错误的boolean运算,它也可以检测由于对语言特性误解而产生的错误。

跟上面一样,这个工具在项目的使用是配置在上面的config目录下的gradle文件中。

task findbugs(type: FindBugs, dependsOn: assembleDebug) {
    ignoreFailures = false
    effort = "max"
    reportLevel = "high"
    excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.xml")
    classes = files("${project.rootDir}/app/build/intermediates/classes")

    source 'src'
    include '**/*.java'
    exclude '**/gen/**'

    reports {
        xml.enabled = false
        html.enabled = true
        xml {
            destination "$project.buildDir/reports/findbugs/findbugs.xml"
        }
        html {
            destination "$project.buildDir/reports/findbugs/findbugs.html"
        }
    }

    classpath = files()
}

它也是一个任务,并且跟上面CheckStyle一样,另外从代码中可以看出,它支持htm和xml两种报告形式,我们可以从中选择一种,上面使用的是html,因为它更具有可读性,另外需要设置报告输出的路径。

由于Android项目是从Java项目略有不同,强烈推荐使用findbugs-filter。它基本上忽略了R文件和你的Manifest文件。顺便说一句,由于FindBugs分析你的代码字节码,你至少需要编译一次你的代码才能够测试它。

3、PMD

PMD是一个很有用的工具,它跟Findbugs类似,但是它不是检测字节码,它是直接检测源代码。它使用静态分析来发现错误。为什么要将它们同时使用呢?因为它们的检测方法不同,可以取到互补的作用。

跟上面一样,这个工具在项目的使用是配置在上面的config目录下的gradle文件中。

task pmd(type: Pmd) {
    ignoreFailures = false
    ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")
    ruleSets = []

    source 'src'
    include '**/*.java'
    exclude '**/gen/**'

    reports {
        xml.enabled = false
        html.enabled = true
        xml {
            destination "$project.buildDir/reports/pmd/pmd.xml"
        }
        html {
            destination "$project.buildDir/reports/pmd/pmd.html"
        }
    }
}

跟Findbugs基本一样,在pmd-ruleset.xml中可以使用自定义的规则,关于规则的定义可以参考文档

http://pmd.sourceforge.net/pmd-5.1.1/howtomakearuleset.html



建议不要使用默认的规则,并且在配置中加入下面这行代码:

ruleSets = []

在上面的配置中我也加了,如果不加的话,默认规则会跟自定义的规则都执行,这样可能导致自定义的规则失效,原因就是默认规则里面可能也定义了这个规则。

4、Android Lint

Android Lint是一个静态的代码分析工具,它可以检测Android项目源文件中潜在的bug,也可以在正确性、安全性、性能、可用性、可访问性和国际化等方面进行优化。正如官方网站所说,Android Lint是另一种静态分析工具,专门为Android服务。它是非常强大的,能给你大量的建议以提高你的代码质量。

跟上面一样,这个工具在项目的使用是配置在上面的config目录下的gradle文件中。

android {
    lintOptions {
        abortOnError true
        xmlReport false
        htmlReport true
        lintConfig file("${project.rootDir}/config/quality/lint/lint.xml")
        htmlOutput file("$project.buildDir/reports/lint/lint-result.html")
        xmlOutput file("$project.buildDir/reports/lint/lint-result.xml")
    }

建议使用单独的文件来定义检测规则。下面这个网站定义了所有规则在最近的ADT版本中。


http://tools.android.com/tips/lint-checks

除了带有“severity”级别为“ignore”的集合外,Android Lint中总是会检测文件中定义的所有的规则。

5、使用

现在在项目中有4个工具,很明显,如果可以同时使用这四个工具那就是最好了,所以可以在gradle任务之间加入一些依赖,例如任务一个接一个的执行,可以使用“check”任务来加入这些工具间的依赖,代码如下:

check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint'

现在,当执行“check”任务,Checkstyle, Findbugs, PMD和 Android Lint将会被执行,当你代码提交了并且push到远程代码仓库请求merge的时候,这是很好的办法来检测代码的质量。

最终使用下面代码来执行check任务就可以代码的检测了。

gradle check

原文链接:


How to improve quality and syntax of your Android code