PMD-Java代碼靜態分析工具使用

       現在,使用代碼分析工具來代替人工進行代碼審查,已是大勢所趨了。用於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

  • 可能的 Bugs:檢查潛在代碼錯誤,如空 try/catch/finally/switch 語句
  • 未使用代碼(Dead code):檢查未使用的變量,參數,方法
  • 複雜的表達式:檢查沒必要要的 if 語句,可被 while 替代的 for 循環
  • 重複的代碼:檢查重複的代碼
  • 循環體建立新對象:檢查在循環體內實例化新對象
  • 資源關閉:檢查 Connect,Result,Statement 等資源使用以後是否被關閉掉

       用戶還能夠本身定義規則,檢查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

相關文章
相關標籤/搜索