在這篇文章中,我將透過不同的自動化工具如CheckStyle,FindBugs,PMD以及Android Lint來介紹(如何)來提高你的安卓程式碼品質。透過自動化的方式檢查你的程式碼非常有用,尤其當你在一個團隊中工作,為了在你的程式碼中保持嚴格的語法格式以及避免很多壞習慣和錯誤。我將仔細地介紹如何在你空閒的時候直接運用這些工具透過Gradle來建立腳本以及如何配置它們。
Fork該範例
我強烈建議你拷貝下這個專案工程,儘管我將介紹的案例都是來自它。同時,你將能夠測試下自己對這些工具的了解情況。
關於Gradle任務
Gradle任務的概念(在Gradle中的含義)是理解該篇文章(以及如何以一種通用的方式寫Gradle腳本)的基礎。我強烈建議你去看下這兩篇關於Gradle任務的文件(這篇和這篇)。這個文件包含了大量的例子,因此它非常容易開始學習。現在,我假定你拷貝了我的Repo,你導入這個工程到你的Android Studio,並且你熟悉Gradle任務。如果不是,別擔心,我將盡我最大的努力讓我的講解更有意義。
關於範例項目的層次結構
你可以將gradle腳本文件分割成很多文件,我現在已經有3個gradle文件:
根文件夾中的文件,這些文件或多或少都是關於這個項目的配置的(用的哪個Maven Repos,用的哪個版本的Gradle)。
App子資料夾中的檔案,這些檔案是典型的用於建立安卓應用程式的gradle檔案。
config子資料夾中的文件,這裡的文件才是我們關係的重點,因為我用這裡的文件保存和設定專案中的所有工具。
Checkstyle
簡介
「Checkstyle是一個開發工具用來幫助程式設計師編寫符合程式碼規範的Java程式碼。它能自動檢查Java程式碼為空閒的人進行無聊(但重要)的任務。
正如Checkstyle的開發者所言,這個工具能夠幫助你在專案中定義和維持一個非常精確和靈活的程式碼規範形式。當你啟動CheckStyle,它會根據所提供的設定檔分析你的Java程式碼並告訴你發現的所有錯誤。 Gradle的形式 下面的程式碼向你展示了在你的專案中使用Checkstyle的最基本的配置(如Gradle任務):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会发现大量的问题,特别是在你运用了大量的规则配置,如同你设置了一个非常精确的语法。尽管我通过Gradle使用 checkstyle,例如在我进行推送之前,我仍然推荐你为IntellJ/Android Studio使用checkstyle插件(你可以通过Android Studio的工作面板文件/设置/插件直接安装插件)。这种方式下,你可以根据那些为Gradle配置的相同文件在你的工程中使用 checkstyle,但是远不止这些,你可以直接在Android Studio中获取带有超链接结果,这些结果通过超链接在你的代码中对应,这是非常有用的(Gradle的这种方式仍然很重要的,因为你可以使用它自动构建系统,如Jenkins)。
Findbugs
简介
Findbugs是否需要一个简介呢?我想它的名称已经让人顾名思义了。“FindBugs使用静态分析方法为出现bug模式检查Java字节码”。FindBugs基本上只需要一个程序来做分析的字节码,所以这是非常容易使用。它能检测到常见的错误,如错误的布尔运算符。FindBugs也能够检测到由于误解语言特点的错误,如Java参数调整(这不是真的有可能因为它的参数是传值)。
Gradle的形式
下面的代码向你展示了在你的项目中使用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”)。
Findbugs的使用技巧
由于Android项目是从Java项目略有不同,我强烈推荐使用FindBugs过滤器(规则配置)。你可以在这一个例子(例如项目之一)。它基本上忽略了R文件和你的Manifest文件。顺便说一句,由于(使用)FindBugs分析你的代码,你至少需要编译一次你的代码才能够测试它。
PMD
简介
这个工具有个有趣的事实:PMD不存在一个准确的名称。(所以)在官网上你可以发现很有有趣的名称,例如:
Pretty Much Done
Project Meets Deadline
事实上,PMD是一个工作有点类似Findbugs的强大工具,但是(PMD)直接检查源代码而不是检查字节码(顺便说句,PMD适用很多语言)。 (PMD和Findbugs)的核心目标是相同的,通过静态分析方法找出哪些模式引起的bug。因此为什么同时使用Findbugs和PMD呢?好吧!尽管Findbugs和PMD拥有相同的目标,(但是)他们的检查方法是不同的。所以PMD有时检查出的bug但是Findbugs却检查不出来,反之亦然。
Gradle的形式
下面的代码向你展示了在你的项目中使用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”)。
PMD的使用技巧
我建议你不要使用默认的规则配置集,你需要添加这行代码(已经加上):
ruleSets = []
否则,因为默认值是这些基本的规则配置集,基本的规则配置集会和你定义的规则集一起执行。所以,如果你的自定义规则集不在那些基本配置集中,他们仍然会执行。
Android Lint
简介
“Android lint工具是一个静态代码分析工具,它能检查安卓项目源文件的潜在缺陷和优化改进的正确性,安全性,性能,可用性,可访问性和国际化。”
正如官方网站所说,Android Lint是另一种静态分析工具,专门为Android服务。它是非常强大的,能给你大量的建议以提高你的代码质量。
Gradle的形式
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”:
IconDensities:这个规则配置确保你定义每个图像资源中的(分辨率)密度(除了ldpi)。
IconDipSize:这个规则配置确保你为每个dip定义合适的资源(换句话来说,如果你没有为每个density设置相同的图片资源,则不需要重新设置图片大小)。
所以你可以重用这个lint文件并激活你想要的所有规则。执行Android Lint任务,就像执行CheckStyle任务(除了任务的名称是”lint”)。
Android 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