天天看点

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

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

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

<?xml version="1.0" encoding="UTF-8"?>
<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>
           

Pmd

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

主要适用于

Java

Apex

,同时也支持其他六种语言,xml方面支持比较鸡肋

支持通过

gradle

插件集成

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

  1. 编程最佳实践,例如AvoidPrintStackTrace,避免使用

    printStackTrace()

    方法,建议使用

    logger

    调用等代码结构方面、方法调用的实践
  2. 编码规范,例如CallSuperInConstructor子类构造函数中要求调用父类构造方法,必须在文件中声明包名等等
  3. 设计,代码结构方面,例如AvoidDeeplyNestedIfStmts要求避免

    if-else

    深层嵌套影响理解和逻辑问题,

    catch

    捕捉块避免再次抛出异常等
  4. 文档方面
  5. 隐患错误(error prone),例如AssignmentInOperand避免使用多元运算符赋值,这会使得代码变得复杂且难以理解
  6. 多线程规范,例如AvoidSynchronizedAtMethodLevel,使用代码块级别的同步,而不是方法级别的同步,方法级别的同步可能会在方法中增加新代码时出现问题
  7. 性能,例如AvoidArrayLoops数组之间的复制避免使用for循环,建议使用

    Arrays.copyOf或者其他api

  8. 安全性,授权码等信息建议使用外部文件调用而不是硬编码
  9. 额外的规则集
    Android 静态代码检测工具 CheckStyle Lint FindBugs Pmd 对比

支持自定义规则,custom Rules,包括

Java

XPath

两种方式,pmd不会直接使用源码,使用的是

JavaCC

生成解析器来解析源码并且生成

AST(Abstract Syntax Tree)

,提供有图形化编辑器

bin/designer.bat

但是有一定的学习成本

表格对比

对比 检测范围 支持扩展自定义规则集 支持规则集 检测范围 开源 gradle插件
styleCheck java 窄,单纯的编码规范 开源 支持
lint java xml 广,代码结构/质量问题 开源 支持
findbugs java 窄,基于问题模板的匹配 开源 支持
pmd java 广,是对比中最广的 开源 支持