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

时间:2021-09-03 07:45:08

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

一、下载案例
通过案例代码可以对这些工具进行测试和了解,下载链接:https://github.com/vincentbrison/vb-android-app-quality

项目结构:
gradle脚本被分离在几个文件中:

1、根目录下的gradle文件

如下图所说,在根目录中有一个build.gradle文件。从这个文件所在的位置也可以看出,它是关于整个项目的配置。
如何提高android代码的质量(CheckStyle、Findbugs、PMD、Lint)

2、app目录下的gradle文件

如下图所示,在app目录下有一个build.gradle文件,它是构建整个Android应用的配置文件。
如何提高android代码的质量(CheckStyle、Findbugs、PMD、Lint)

3、config目录下的gradle文件

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

二、工具介绍
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