现在,使用代码分析工具来代替人工进行代码审查,已是大势所趋了。用于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