文中部分网址可能需要梯子
Java
静态代码检测工具,主要用于代码的编码规范检测 。
通过分析源码,与已知的编码约定进行对比,以html的形式将结果展示出来。能检测什么?代码规范
目前不支持用户自定义检测规则,已有的规则中,有一部分规则是有属性的,例如设置ParameterNumber,可以设置最大参数个数max = ?
这里是支持的格式检测
apply plugin: 'checkstyle'
task checkstyle(type: Checkstyle) {
description 'Check code standard'
group 'verification'
configFile file('./code_quality_tools/checkstyle.xml')
source 'src'
include '**/*.java'
exclude '**/gen/**'
classpath = files()
ignoreFailures = false
}
其中,configFile
属性就是用户指定的规则描述文件
Android Studio 提供的代码扫描工具
能检测什么?是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进,帮助我们发现代码结构/质量问题,同时提供一些解决方案
每个问题都有信息描述和等级
主要包括以下几个方面
Correctness:不够完美的编码,比如硬编码、使用过时 API 等
Performance:对性能有影响的编码,比如:静态引用,循环引用等
Internationalization:国际化,直接使用汉字,没有使用资源引用等
Security:不安全的编码,比如在 WebView 中允许使用 JavaScriptInterface 等
用户可以通过配置文件来自定义lint
检测的内容,需要在主项目目录下,创建名为lint.xml
的文件,构建时会自动识别,文件中
android {
...
lintOptions {
// 指定禁用哪些issue的检测
disable 'TypographyFractions','TypographyQuotes'
// 指定除了默认issue外,还支持哪些issue
enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
// To enable checks for only a subset of issue IDs and ignore all others,
// list the issue IDs with the 'check' property instead. This property overrides
// any issue IDs you enable or disable using the properties above.
check 'NewApi', 'InlinedApi'
// 为true的情况下,遇到lint问题后退出检测
quiet true
// 为true的情况下,出现error则停止构建
abortOnError false
// 忽略警告信息
ignoreWarnings true
}
}
LintOptions所有的属性
执行
Java
静态代码检测工具,通过字节码与已知错误模式列表进行对比匹配来查找潜在问题
主页
基于给定的问题列表,更多的是用于提前检测编码过程中潜在的,会导致运行异常的问题,例如使用了未初始化的引用,clone()
方法的实现中没有调用父类的同名方法等,拥有GUI
错误模式列表
apply plugin: 'findbugs'
task findbugs(type: FindBugs) {
description 'Run findbugs'
group 'verification'
classes = files("$project.buildDir/intermediates/classes")
source 'src'
classpath = files()
effort 'max'
reportLevel = "high"
excludeFilter file('./code_quality_tools/findbugs-exclude.xml')
reports {
xml.enabled = false
html.enabled = true
}
ignoreFailures = false
}
其中,excludeFilter
指定的是过滤集合,此处的过滤是符合正则表达式的文件忽略哪些错误模板;
effort
,指定值应为min,default或max其中之一。级别越高精度越高,发现的错误越多,不过代价是需要运行时间和消耗内存;
reportLevel
,报告错误的优先级阈值。如果reportLevel设置为低,则会报告所有错误。如果设置为中等(默认),会报告中、高优先级错误。如果设置为高,则仅报告高优先级的错误
<FindBugsFilter>
<Match>
<Class name="~.*\.R\$.*"/>
Match>
<Match>
<Class name="~.*\.Manifest\$.*"/>
Match>
<Match>
<Class name="~.*\.*Test" />
<Not>
<Bug code="IJU" />
Not>
Match>
<Match>
<Package name="com.actionbarsherlock.internal.nineoldandroids.animation" />
Match>
<Match>
<Package name="com.actionbarsherlock.view" />
Match>
<Match>
<Package name="com.actionbarsherlock.internal.widget" />
Match>
FindBugsFilter>
静态代码检测工具,目的是寻找编码过程中的代码缺陷,例如未使用过的变量,空的catch捕捉块,不必要的对象创建等等
主要适用于Java
和Apex
,同时也支持其他六种语言,xml方面支持比较鸡肋
支持通过gradle
插件集成
提供了很多内建的检测规范,包括以下几个方面
printStackTrace()
方法,建议使用logger
调用等代码结构方面、方法调用的实践if-else
深层嵌套影响理解和逻辑问题,catch
捕捉块避免再次抛出异常等Arrays.copyOf或者其他api
支持自定义规则,custom Rules,包括Java
和XPath
两种方式,pmd不会直接使用源码,使用的是JavaCC
生成解析器来解析源码并且生成AST(Abstract Syntax Tree)
,提供有图形化编辑器bin/designer.bat
但是有一定的学习成本
对比 | 检测范围 | 支持扩展自定义规则集 | 支持规则集 | 检测范围 | 开源 | gradle插件 |
---|---|---|---|---|---|---|
styleCheck | java | 否 | 是 | 窄,单纯的编码规范 | 开源 | 支持 |
lint | java xml | 否 | 是 | 广,代码结构/质量问题 | 开源 | 支持 |
findbugs | java | 否 | 是 | 窄,基于问题模板的匹配 | 开源 | 支持 |
pmd | java | 是 | 是 | 广,是对比中最广的 | 开源 | 支持 |