現在,使用代碼分析工具來代替人工進行代碼審查,已是大勢所趨了。用於Java代碼檢測的工具中,不乏許許多多的佼佼者,其中PMD就是其中一款。PMD既能夠獨立運行,也能夠以命令行的形式運行,還能夠做爲插件在IDE中運行,本文將基於在Android Studio中的使用來介紹PMD的基本使用。html
1、PMD簡介java
對於PMD名稱含義,有個有趣的現象,PMD不存在一個準確的名稱,在官網上你能夠發現頗有有趣的名稱 ,好比:Pretty Much Done,Project Meets Deadline等。PMD是一款程序代碼檢查工具(能夠支持多種語言,以Java爲例),經過靜態分析Java源文件來獲知代碼錯誤,也就是說在不運行不編譯Java程序的狀況下直接掃描Java源文件,報告錯誤 。該軟件功能強大,掃描效率高,是Java程序員debug的好幫手。它附帶了許多能夠直接使用的規則,利用這些規則能夠找出Java源程序的許多問題,好比:android
用戶還能夠本身定義規則,檢查Java代碼是否符合某些特定的編碼規範。例如,你能夠編寫一個規則,要求PMD找出全部建立Thread對象的操做。git
PMD支持的編輯器包括:JDeveloper、Eclipse、JEdit、JBuilder、BlueJ、CodeGuide、NetBeans/Sun Java Studio Enterprise/Creator、IntelliJ IDEA(Android Studio是基於此編輯器)、TextPad、Maven、Ant、Gel、JCreator和Emacs。程序員
2、PMD的安裝 github
經過File > Settings > Plugins > Browse repositories 搜索 「PMD」,找到「PMDPlugin」這一項,按照提示進行安裝,而後重啓便可。app
3、使用PMD檢測代碼編輯器
一、啓動PMD檢測功能ide
(1)從Tools菜單中啓動工具
經過Tools > Run PMD能夠看到以下的界面。從運行結果來看,若是經過該方式啓動,掃描的範圍就是整個個項目中的文件了。
Pre Defined:表示預約義的規則,也就是該插件自帶的檢測規則。後面展開的列表中列處了全部的規則列表,想掃描哪種類型的問題,點擊便可。其中「All」表示使用全部的規則。
Custom Rules:自定的檢測規則。該插件容許用戶根據本身的須要自定義檢查規則,默認這裏是不可點擊的,須要在設置中導入自定義規則文件後方可選擇。
(2)從右鍵菜單中啓動
在文件或者編輯器中點擊右鍵,也能夠看到「Run PMD」選項,和從「Tools」菜單中啓動同樣,這裏不贅述了。經過該方式啓動, 檢測範圍取決於鼠標或光標當前所選中的區域。
二、運行結果
運行後會出現以下面板:
左邊工具欄,鼠標停留在上面會提示其功能,比較簡單就不囉嗦了。右邊顯示了檢測結果,這裏顯示的結果類別取決於咱們運行的時候在「Pre Defined」中選擇的規則類型,由於前面選擇的「All」,因此全部的規則都顯示了。當點擊具體某一問題項時,會跳轉到對應的源碼中。
4、配置檢測規則
經過File > Settings > Other Settings > PMD能夠打開檢測規則的設置界面:
在「RuleSets(規則設置)」界面能夠管理自定義的檢測規則。由於在實際工做中,可能有些團隊須要根據實際狀況自定義檢測規則,就能夠經過這裏導入。若是要使用它,須要在啓動PMD進行檢測時選擇該自定義規則。
點擊「Options」選項卡,在其中能夠配置一些檢測規則選項
其中重點須要留意的是「Skip TestSource」這一項,由於在項目中有很多Android Studio自動生成的測試代碼,以下所示,選擇上述選項後能夠將其過濾掉。
5、PMD的高級使用
本文主要介紹PMD的基本使用,同時限於筆者的水平有限,這裏僅簡單介紹一下它的高級使用。
PMD功能很是強大,僅僅是針對Java的檢測就附帶了讓人衆多的規則,這裏提供一份《PMD插件分析代碼規則(中文).xls》文檔,有興趣的能夠下載深刻了解:
連接:https://pan.baidu.com/s/189OTD_k-RbEX4ABJbAMlIg
提取碼:90f4
對於自定義規則,這裏提供一個自定義模板(pmd_custom_rule.xml,能夠直接導入使用),能夠經過這個模板學習一下PMD的規則定義:
1 <?xml version="1.0"?> 2 <ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Android Application Rules" 3 xmlns="http://pmd.sf.net/ruleset/1.0.0" 4 xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd" 5 xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"> 6 7 <description>Custom ruleset for ribot Android application</description> 8 9 <exclude-pattern>.*/R.java</exclude-pattern> 10 <exclude-pattern>.*/gen/.*</exclude-pattern> 11 12 <rule ref="rulesets/java/android.xml" /> 13 <rule ref="rulesets/java/clone.xml" /> 14 <rule ref="rulesets/java/finalizers.xml" /> 15 <rule ref="rulesets/java/imports.xml"> 16 <!-- Espresso is designed this way !--> 17 <exclude name="TooManyStaticImports" /> 18 </rule> 19 <rule ref="rulesets/java/logging-java.xml"> 20 <!-- This rule wasn't working properly and given errors in every var call info --> 21 <exclude name="GuardLogStatementJavaUtil" /> 22 </rule> 23 <rule ref="rulesets/java/braces.xml"> 24 <!-- We allow single line if's without braces --> 25 <exclude name="IfStmtsMustUseBraces" /> 26 </rule> 27 <rule ref="rulesets/java/strings.xml" > 28 <!-- Exclude because causes problems with SQL Strings that usually require duplication --> 29 <exclude name="AvoidDuplicateLiterals"/> 30 </rule> 31 <rule ref="rulesets/java/basic.xml" /> 32 <rule ref="rulesets/java/naming.xml"> 33 <exclude name="AbstractNaming" /> 34 <exclude name="LongVariable" /> 35 <exclude name="ShortMethodName" /> 36 <exclude name="ShortVariable" /> 37 <exclude name="ShortClassName" /> 38 <exclude name="VariableNamingConventions" /> 39 </rule> 40 </ruleset>
友情連接:
PMD Java rules官方文檔介紹:https://pmd.github.io/pmd-6.19.0/pmd_rules_java.html
PMD 官網:https://pmd.github.io