Java代码静态检查工具Error Prone

01

什么是 Error Prone?

谷歌2015年开源的java静态检查工具,可以轻松集成于现有的编译环境中,帮助开发者在编译期间发现代码缺陷,针对java和Android十分适用。

  • Hook标准的构建过程,代码无侵入- 错误产生后及时告知- 提供完善的修复建议,并且允许基于此构建工具

    示例:

image



02

如何使用?

1、添加依赖

Gradle配置方案是由外部贡献(https://github.com/tbroyer/gradle-errorprone-plugin)
image


注意:

Gradle插件依赖Gradle内部API,只支持Gradle2.0以上的对应版本,且需要要与javac版本对应(JDK7以上)



( Maven、ANT配置见官方文档:http://errorprone.info/docs/installation)


2、控制检查项

Error Prone中使用bug模板的方式进行检查,允许用户启用和禁用特定检查项,可以配置选项来旋盖默认的严重级别。

Javac的命令行选项如下

-Xep:<checkName>[:severity]

CheckName是检查规范的名称,例如上面例子中的” StringSplitter”;

Serverity是{“OFF”,“WARN”,“ERROR”}之一,ERROR会中断编译并告警,WARN会提示告警但不会中断编译,其他值会导致编译错误。

如果一个检查项被重复设置,则使用最后一次设置的severity生效。

使用gradle中的设置举例:

image

image




注: D:\AndroidTest\leakcanary-1.5.4\leakcanary-android\src\main\java\com\squareup\leakcanary\internal\LeakCanaryInternals.java使用或覆盖了已过时的 API。

注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。

1 个错误


3、过滤检查目录

我们还可以自定义过滤检查目录来减少无必要的检查与误报。例如官方的例子,我们在complieArgs添加-XepExcludedPaths 标志,以过滤包含build/generated的路径下所有文件

image


4、优势与缺陷

对比老牌的FindBugs,Error Prone有很多优点:

  • Google主导并开源的项目,社区活跃度很高,有详细丰富的文档指导- 提供简单但明确的修复指导- Bug Partten的检查模式,不必维护xml- 不检查字节码,hook到编译过程中,编译即体现,可以尽早发现问题- 支持插件化的自定义检查标准,已有基于Error Prone开源项目NullAway

    缺点:
  • 不支持多语言- 仅支持JDK7以上,且与Gradle版本的协调稍显繁琐- 目前源码中已有的检查标准比较谨慎,只有100左右的告警,不如FindBugs丰富- 会增加编译时间

5、应用与前景

   使用Error Prone可以尽早捕获最基础的错误,完全符合QA对于挖掘有价值bug的理念。在项目的debug阶段,Error Prone的介入可以大幅降低由基础编码错误导致的bug发生,并培养开发形成良好的编程规范。在Release编译时关闭Error Prone,配合Findbugs进行检查形成从开发到CI门禁的质量保证流程。

   年轻活跃的开源社区是 Error Prone最大的优势,有着广阔的探索视野,且Google、Uber、Flipboard对于 Error Prone丰富的实践经验,有力的保证了该项目的应用前景。QTest已经在测试开发内部探索实践Error Prone,后续会继续和小伙伴们分享并探讨。

参考链接

https://github.com/google/error-prone

https://github.com/tbroyer/gradle-errorprone-plugin

http://errorprone.info/

Q


本文转载自 360质量效能