在这篇文章中,我将经过不一样的自动化工具如CheckStyle,FindBugs,PMD以及Android Lint来介绍(如何)提升你的安卓代码质量。经过自动化的方式检查你的代码很是有用,尤为当你在一个团队中工做,为了在你的代码中保持严格的语法格式以及避免不少坏习惯和错误。我将仔细地介绍如何在你空闲的时候直接运用这些工具经过Gradle构建脚本以及如何配置它们。php
我强烈建议你拷贝下这个项目工程,尽管我将介绍的案例都是来自它。与此同时,你将可以测试下本身对这些工具的了解状况。html
Gradle任务的概念(在Gradle中的含义)是理解该篇文章(以及如何以一种通用的方式写Gradle脚本)的基础。我强烈建议你去看下这两篇关于Gradle任务的文档(这篇和这篇)。这个文档包含了大量的例子,所以它很是容易开始学习。如今,我假定你拷贝了个人Repo,你导入这个工程到你的Android Studio,而且你熟悉Gradle任务。若是不是,别担忧,我将尽我最大的努力让个人讲解更有意义。java
你能够将gradle脚本文件分割成不少文件,我如今已经有3个gradle文件:android
“Checkstyle是一个开发工具用来帮助程序员编写符合代码规范的Java代码。它能自动检查Java代码为空闲的人进行这项无聊(但重要)的任务。”git
正如Checkstyle的开发者所言,这个工具可以帮助你在项目中定义和维持一个很是精确和灵活的代码规范形式。当你启动CheckStyle,它会根据所提供的配置文件分析你的Java代码并告诉你发现的全部错误。程序员
下面的代码向你展现了在你的项目中使用Checkstyle的最基本的配置(如Gradle任务):github
task checkstyle(type: Checkstyle) {
configFile file("${project.rootDir}/config/quality/checkstyle/checkstyle.xml") // Where my checkstyle config is...
configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath // Where is my suppressions file for checkstyle is...
source 'src'
include '**/*.java' exclude '**/gen/**' classpath = files() }
因此,基本上这个任务会根据checkstyle.xml和suppressions.xml分析你的代码。经过Android Studio执行它仅仅须要从工具面的CheckStyle来启动它。api
启动CheckStyle以后,你讲收到一个报告用于展现在你项目中发现的每一个错误。这是很是直接的方式。安全
若是你想在checkstyle上作更多的配置,能够参考这篇文档。app
Checkstyle会发现大量的问题,特别是在你运用了大量的规则配置,如同你设置了一个很是精确的语法。尽管我经过Gradle使用 checkstyle,例如在我进行推送以前,我仍然推荐你为IntellJ/Android Studio使用checkstyle插件(你能够经过Android Studio的工做面板文件/设置/插件直接安装插件)。这种方式下,你能够根据那些为Gradle配置的相同文件在你的工程中使用 checkstyle,可是远不止这些,你能够直接在Android Studio中获取带有超连接结果,这些结果经过超连接在你的代码中对应,这是很是有用的(Gradle的这种方式仍然很重要的,由于你可使用它自动构建系统,如Jenkins)。
Findbugs是否须要一个简介呢?我想它的名称已经让人顾名思义了。“FindBugs使用静态分析方法为出现bug模式检查Java字节码”。FindBugs基本上只须要一个程序来作分析的字节码,因此这是很是容易使用。它能检测到常见的错误,如错误的布尔运算符。FindBugs也可以检测到因为误解语言特色的错误,如Java参数调整(这不是真的有可能由于它的参数是传值)。
下面的代码向你展现了在你的项目中使用Findbugs的最基本的配置(以Gradle任务为例):
task findbugs(type: FindBugs) {
ignoreFailures = false
effort = "max"
reportLevel = "high"
excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.xml")
classes = files("${project.rootDir}/app/build/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任务。尽管Findbugs支持HTML和XML两种报告形式,我选择HTML形式,由于这种形式更具备可读性。并且,你只须要把报告的位置设置为书签就能够快速访问它的位置。这个任务也会失败若是发现Findbgus错误失败(一样生成报告)。执行 FindBugs任务,就像执行CheckStyle任务(除了任务的名称是“FindBugs”)。
因为Android项目是从Java项目略有不一样,我强烈推荐使用FindBugs过滤器(规则配置)。你能够在这一个例子(例如项目之一)。它基本上忽略了R文件和你的Manifest文件。顺便说一句,因为(使用)FindBugs分析你的代码,你至少须要编译一次你的代码才可以测试它。
这个工具备个有趣的事实:PMD不存在一个准确的名称。(因此)在官网上你能够发现颇有有趣的名称,例如:
事实上,PMD是一个工做有点相似Findbugs的强大工具,可是(PMD)直接检查源代码而不是检查字节码(顺便说句,PMD适用不少语言)。 (PMD和Findbugs)的核心目标是相同的,经过静态分析方法找出哪些模式引发的bug。所以为何同时使用Findbugs和PMD呢?好吧!尽管Findbugs和PMD拥有相同的目标,(可是)他们的检查方法是不一样的。因此PMD有时检查出的bug可是Findbugs却检查不出来,反之亦然。
下面的代码向你展现了在你的项目中使用PMD的最基本的配置(以Gradle任务为例):
task pmd(type: Pmd) {
ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")
ignoreFailures = false
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" } } }
就PMD来讲,它几乎与Findbugs相同。PMD支持HTML和XML两种报告形式,因此我再次选择HTML形式。我强烈建议你使用本身的通用配置集文件,正如同我在这个例子(check this file)中同样。因此,你固然应该去看下这些通用配置集文件。我建议你,由于PMD可比FindBugs更有争议的不少,例如:若是你不声明”if statement”或”if statement”为空,它基本上会给你警告信息。若是这些规则是正确的,或这对于您的项目(来讲是正确的),我真的承认你和你队友的工做。我不但愿程序由于”if statement”崩溃,我认为这样程序的可读性不好。执行PMD任务,就像是(执行)CheckStyle任务(除了任务的名称是“PMD”)。
我建议你不要使用默认的规则配置集,你须要添加这行代码(已经加上):
ruleSets = []
不然,由于默认值是这些基本的规则配置集,基本的规则配置集会和你定义的规则集一块儿执行。因此,若是你的自定义规则集不在那些基本配置集中,他们仍然会执行。
“Android lint工具是一个静态代码分析工具,它能检查安卓项目源文件的潜在缺陷和优化改进的正确性,安全性,性能,可用性,可访问性和国际化。”
正如官方网站所说,Android Lint是另外一种静态分析工具,专门为Android服务。它是很是强大的,能给你大量的建议以提升你的代码质量。
android {
lintOptions {
abortOnError true
lintConfig file("${project.rootDir}/config/quality/lint/lint.xml")
// if true, generate an HTML report (with issue explanations, sourcecode, etc)
htmlReport true // optional path to report (default will be lint-results.html in the builddir) htmlOutput file("$project.buildDir/reports/lint/lint.html") }
我建议你使用一个单独的文件来定义哪些配置须要使用和不使用。这个网站根据最新的ADT版本定义了所有的配置。个人演示项目中的lint文件包含全部这些规则(ADT 21),包含等级为”ignore”的”severity”:
因此你能够重用这个lint文件并激活你想要的全部规则。执行Android Lint任务,就像执行CheckStyle任务(除了任务的名称是”lint”)。
对于Android Lint没有什么特别的技巧,只须要牢记Android Lint会测试全部配置规则,除了那些等级为“ignore”的“severity”的配置。所以若是发布了新版本ADT下的新配置规则,他们将被检查,而不是忽视。
如今,你有全部的方法为您的项目使用这四个工具。显然,若是咱们能同时使用这四个工具会更好。你能够添加你的gradle任务之间的依赖,好比当你执行一个任务,其余任务则是第一个完成后执行。一般在Gradle中,经过让工具具备“check”任务来达到工具之间的相互关系:
check.dependsOn ‘checkstyle’, ‘findbugs’, ‘pmd’, ‘lint’如今,当执行“check” 任务的时候,Checkstyle, Findbugs, PMD, and Android Lint将会同时执行。在你执行/ commiting / pushing / ask merge request 以前进行质量检查是一个很棒的方式。
你能够在这个Gradle文件中找到全部任务的一个完整例子。你能够把全部的质量配置文件和Gradle文件从你看到的演示实例中分开,这些演示的实例把一块儿都放在“config/quality” 文件夹下。
在这篇文章中,利用Gradle对Android使用代码质量检查工具是很是容易。比使用质量工具局部检查您的项目在您本身的计算机上,这些工具能够用于自动构建如Jenkins/Hudson这样的平台,让你自动进行质量检查,同时自动创建过程。执行全部我从CLI展示的测试,如同在 Jenkins/Hudson上执行,简单地执行:
gradle check请随时对这篇文章发表评论,或者问任何有关Android的问题。
原文连接 : How to improve quality and syntax of your Android code 译文:http://www.devtf.cn/