一、工具介绍
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