lint/pmd/p3c静态代码检查工具的配置与使用

  • Post author:
  • Post category:其他


一、工具介绍


1、lint/pmd/p3c工具做检查。

其中,pmd/p3c偏向于java语言本身,lint工具入偏向于android。

(后续会考虑加入C/C++的代码检查。)

工具、规则介绍:

pmd:

https://pmd.github.io/


https://pmd.github.io/pmd/pmd_rules_java_design.html


p3c:

https://github.com/alibaba/p3c


https://github.com/alibaba/p3c/tree/master/p3c-gitbook


lint: 命令行运行:lint show

二、工具使用方法


1、IDE上对应插件的使用。

支持使用的IDE:android studio/Intellij IDEA。

两个工具的使用方法、插件配置类似,全文以android studio为例。

step1. 安装pmdplugin、alibaba Java Coding Guidelines

方法一、IDE => Performances => Plugins => Marketplace

搜索并安装如上pmd/ alibaba两个插件。

方法二、手动下载插件,后安装。

pmdplugin:

https://plugins.jetbrains.com/plugin/1137-pmdplugin/versions

(下载时特别注意选择IDE平台)

alibaba:

https://github.com/alibaba/p3c/blob/master/idea-plugin/README_cn.md


推荐使用方法一,特别注意:如果是手动下载安装插件,建议IDE更新到最新版本,下载最新版本的插件。非最新版本IDE,可能会有一些安装使用问题。

step2. 配置插件

LINT

lint:

https://developer.android.com/studio/write/lint?hl=zh-CN#manuallyRunInspections


限制只检查指定规则的方法:

1> 在build.gradle里面

apply ‘com.android.lib’

apply ‘com.android.application’

的项目下进行配置。

1、在build.gradle最后添加

android{


lintOptions{


abortOnError false

//check ‘NewApi’

lintConfig file(‘lint.xml’)

}

}

2> 拷贝配置文件lint.xml文件到build.gradle所在目录

step3. 使用插件进行检查


LINT


1> 在 Android 视图中,打开项目并选择此项目以及您要分析的文件夹或文件。

2> 从菜单栏选择 Analyze > Inspect Code。

3> 在 Specify Inspection Scope 对话框中查看设置。

4> 在 Inspection Profile 中,保留默认的配置文件 (Project Default)。

5> 点击 OK 以运行检查,显示运行 Inspect Code 所生成的 Lint 和其他 IDE 检查结果。

关于具体的配置定制见

https://developer.android.com/studio/write/lint?hl=zh-CN#manuallyRunInspections


PMD


限制只检查指定规则的方法:

1> 配置检查规则: IDE => Performances => Other Settings => PMD

2> 点击加号添加规则,选择附件中给出的pmd规则

3> 使用配置的检查规则进行检查: IDE => Run PMD => Custom Rules => highpriority_config

4> 开始pmd检查,并显示检查的结果。


P3C


未发现可以在plugin中配置指定规则的方法。

1> 检查: IDE => 阿里编码规约 => 编码规约扫描



特别的


,LINT/P3C可以一起选择后进行检查。在build.gradle里面的配置的lintConfig在命令行、IDE检查中均有效。

方法: Analyze => Inspect Code => 打开配置 => 同时选择Ali-Check 和 Android lint。

2、命令行方法检查(按需查阅)


LINT


限制只检查指定规则的方法:

1> 在build.gradle里面

apply ‘com.android.lib’

apply ‘com.android.application’

的项目下进行配置。

a. 在build.gradle最后添加


android{


lintOptions{


abortOnError false

//check 'NewApi'

lintConfig file('lint.xml')

}

}

b. 拷贝配置文件lint.xml文件到build.gradle所在目录

lint只会检查包含了AndroidManifest.xml的应用项目

非独立应用lint检查命令:

lint code_dir –config lint.xml –xml result.xml

独立应用lint检查命令:

./gradlew lintRelease [-p project]

结果路径会显示在日志打印中,按settings.gradle 里面的项目来分别生成结果文件。


PMD/P3C


1> 下载源码


https://github.com/pmd/pmd



https://github.com/alibaba/p3c

2> 进入到相应用项目目录进行编译 mvn install

pmd/pmd-java

p3c/p3c-pmd

(若pmd编译有问题,参考

https://github.com/xnfreedom/pmd/commit/93ffb8408dd428c05f8294ea5f6dec9ef7b7411f、



https://github.com/xnfreedom/pmd/commit/c32fa0f725c61f2fc7434dc0a400251c7ca9de29解决)

3> pmd工具下载、配置


https://pmd.github.io/


命令行方式运行p3c:

https://github.com/alibaba/p3c/issues/50

4> 配置要使用的规则。


pmd:


文件位置:pmd/pmd-java/target/classes/category/java/high_priority_config.xml

内容:

<?xml version=”1.0″ encoding=”UTF-8″?>

<ruleset name=”pmd_high_priority”

xmlns=”http://pmd.sourceforge.net/ruleset/2.0.0″

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=”http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd”>

<description>

Rules specific to 1/2 priority

</description>

<!– Rules, that have been moved into a category –>

<rule ref=”category/java/bestpractices.xml/AvoidReassigningParameters” deprecated=”true” />

<rule ref=”category/java/bestpractices.xml/GuardLogStatement” deprecated=”true” />

</ruleset>


p3c:


文件位置:p3c/p3c-pmd/target/classes/rulesets/java/high_priority_config.xml

内容:

<?xml version=”1.0″ encoding=”UTF-8″?>

<ruleset name=”p3c_high_priority”

xmlns=”http://pmd.sourceforge.net/ruleset/2.0.0″

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=”http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd”>

<description>

Rules specific to 1/2 priority

</description>

<!– Rules, that have been moved into a category –>

<rule ref=”rulesets/java/ali-comment.xml/EnumConstantsMustHaveCommentRule” deprecated=”true” />

<rule ref=”rulesets/java/ali-concurrent.xml/ThreadPoolCreationRule” deprecated=”true” />

<rule ref=”rulesets/java/ali-concurrent.xml/AvoidUseTimerRule” deprecated=”true” />

<rule ref=”rulesets/java/ali-concurrent.xml/AvoidManuallyCreateThreadRule” deprecated=”true” />

<rule ref=”rulesets/java/ali-concurrent.xml/ThreadShouldSetNameRule” deprecated=”true” />

<rule ref=”rulesets/java/ali-concurrent.xml/AvoidCallStaticSimpleDateFormatRule” deprecated=”true” />

<rule ref=”rulesets/java/ali-concurrent.xml/ThreadLocalShouldRemoveRule” deprecated=”true” />

<rule ref=”rulesets/java/ali-constant.xml/UpperEllRule” deprecated=”true” />

</ruleset>

注意:

deprecated=”true” 是表示在pmd 7.0.0将会不再支持这条规则。

其实不是所有的都需要打上这个tag, 部分规则需要。

5> 命令行运行pmd/p3c检查

pmd:

/Users/mz/tools/pmd/pmd-bin-6.16.0/bin/run.sh pmd -d /Users/mz/Code/apps/FileManager/FileManager -f xml -R /Users/mz/Code/github/pmd/pmd-java/target/classes/category/java/high_priority_config.xml > /Users/mz/Code/apps/FileManager/FileManager/preferdCheckResut/pmd-high_priority_result.xml

p3c:

/Users/mz/tools/pmd/pmd-bin-6.16.0/bin/run.sh pmd -d /Users/mz/Code/apps/FileManager/FileManager -f xml -R /Users/mz/Code/github/p3c/p3c-pmd/target/classes/rulesets/java/high_priority_config.xml > /Users/mz/Code/apps/FileManager/FileManager/preferdCheckResut/p3c-high_priority_result.xml



版权声明:本文为xnfreedom原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。