频道栏目
首页 > 资讯 > Android > 正文

Android开发中关于静态代码检测工具 CheckStyle Lint FindBugs Pmd 的对比讲解

18-07-13        来源:[db:作者]  
收藏   我要投稿

Android 静态代码检测工具 CheckStyle Lint FindBugs Pmd 对比

CheckStyle

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属性就是用户指定的规则描述文件

Lint

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所有的属性

执行/tools/lint --list命令,可查看支持的所有Issue的id。

FindBugs

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设置为低,则会报告所有错误。如果设置为中等(默认),会报告中、高优先级错误。如果设置为高,则仅报告高优先级的错误



 
  
 
 
  
 
 
  
  

  
 

 
  
 

 
  
 

 
  
 

Pmd

静态代码检测工具,目的是寻找编码过程中的代码缺陷,例如未使用过的变量,空的catch捕捉块,不必要的对象创建等等

主要适用于Java和Apex,同时也支持其他六种语言,xml方面支持比较鸡肋

支持通过gradle插件集成

提供了很多内建的检测规范,包括以下几个方面

编程最佳实践,例如AvoidPrintStackTrace,避免使用printStackTrace()方法,建议使用logger调用等代码结构方面、方法调用的实践 编码规范,例如CallSuperInConstructor子类构造函数中要求调用父类构造方法,必须在文件中声明包名等等 设计,代码结构方面,例如AvoidDeeplyNestedIfStmts要求避免if-else深层嵌套影响理解和逻辑问题,catch捕捉块避免再次抛出异常等 文档方面 隐患错误(error prone),例如AssignmentInOperand避免使用多元运算符赋值,这会使得代码变得复杂且难以理解 多线程规范,例如AvoidSynchronizedAtMethodLevel,使用代码块级别的同步,而不是方法级别的同步,方法级别的同步可能会在方法中增加新代码时出现问题 性能,例如AvoidArrayLoops数组之间的复制避免使用for循环,建议使用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 广,是对比中最广的 开源 支持

相关TAG标签
上一篇:Android开发关于内存抖动的分析和注意事项
下一篇:jdk1.8创建证书及tomcat8.5配置https的步骤教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站