- private void testCollectionIncompatibleType() {
- Set<Short> set = new HashSet<>();
- set.add(Short.valueOf("1"));
- set.remove(0);
- }
上面的代码中
报出的错误信息为
- /Users/jishuxiaoheiwu/github/ErrorProneSample/app/src/main/java/com/example/jishuxiaoheiwu/errorpronesample/MainActivity.java:24:
- error: [CollectionIncompatibleType] Argument '0' should not be passed to this method; its type int is not compatible with its collection's type argument Short
- set.remove(0);
- ^
- (see http://errorprone.info/bugpattern/CollectionIncompatibleType)
再举一个例子
- "hello World".getBytes().toString();
报出的错误是
- /Users/jishuxiaoheiwu/github/ErrorProneSample/app/src/main/java/com/example/jishuxiaoheiwu/errorpronesample/MainActivity.java:16:
- error: [ArrayToString] Calling toString on an array does not provide useful information
- "hello World".getBytes().toString();
- ^
- (see http://errorprone.info/bugpattern/ArrayToString)
提示上面的 byte[].toString() 方法打印没有有用信息。
Error-prone 是基于 BugPattern 来发现问题的,覆盖范围不仅限于 Java 还包含 Android 代码。一些比较常见的 BugPattern 有如下这些
BugPattern 有三种严重程度,如下
只有 ERROR 的严重程度才会中断当前的编译,其他情况都会以日志输出形式展现。
error-prone 有对应的 gradle 插件,只需要应用即可。需要的操作很简单,只需要三步
一个完整的代码示例如下,修改的文件为 Project 的 build.gradle 文件
- buildscript {
- repositories {
- jcenter()
- // error-prone相关配置
- maven {
- url "https://plugins.gradle.org/m2/"
- }
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.2.3'
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- // error-prone相关配置
- classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.9"
- }
- }
- allprojects {
- repositories {
- jcenter()
- }
- //error-prone相关配置
- apply plugin: "net.ltgt.errorprone"
- }
Error-prone plugin 提供了方法允许我们配置 bugpattern 的处理方式。
基本的做法是
- tasks.withType(JavaCompile) {
- options.compilerArgs += [ '-Xep:<checkName>[:severity]' ]
- }
比如我们想要将 ArrayToString 从 ERROR 转成 WARNING,我们可以这样做
- tasks.withType(JavaCompile) {
- options.compilerArgs += [ '-Xep:ArrayToString:WARN' ]
- }
除此之外还有一些特殊的参数
其他的参数可以具体参考 ErrorProneOptions.java
理论上,error-prone 在编译时期进行代码分析并检查,会延长了编译时间,加之 Gradle 编译本来就很慢,为了不对我们日常的构建造成影响,我们可以分条件开启 error-prone, 即
具体的做法是通过想 gradle 传递参数来实现。简易代码如下。
- allprojects {
- repositories {
- jcenter()
- }
- //如果接受的参数有enableErrorProne则应用插件,否则不应用
- if (project.hasProperty("enableErrorProne")) {
- apply plugin: "net.ltgt.errorprone"
- }
- }
使用如下,则会开启应用插件
- ./gradlew assembleDebug -PenableErrorProne
以上就是关于 error-prone 的一些简单总结。Error-prone 在 Flipboard 中已经应用很久,采用的方式为开发构建时不开启,在持续集成时开启。大家可根据自己和团队的需要选择并应用 error-prone,来快速发现问题并改善代码的质量。
来源: http://www.tuicool.com/articles/fYnqmer