在這篇文章中,我將經過不一樣的自動化工具如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/