1 2 3 4 5 | private void testCollectionIncompatibleType() { Set<Short> set = new HashSet<>(); set.add(Short.valueOf("1")); set.remove(0); } |
---|
上面的代码中
报出的错误信息为
1 2 3 4 5 | /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) |
---|
再举一个例子
1 | "hello World".getBytes().toString(); |
---|
报出的错误是
1 2 3 4 5 | /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文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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的处理方式。
基本的做法是
1 2 3 | tasks.withType(JavaCompile) { options.compilerArgs += [ '-Xep:<checkName>[:severity]' ] } |
---|
比如我们想要将ArrayToString从ERROR转成WARNING,我们可以这样做
1 2 3 | tasks.withType(JavaCompile) { options.compilerArgs += [ '-Xep:ArrayToString:WARN' ] } |
---|
除此之外还有一些特殊的参数
其他的参数可以具体参考ErrorProneOptions.java
理论上,error-prone在编译时期进行代码分析并检查,会延长了编译时间,加之Gradle编译本来就很慢,为了不对我们日常的构建造成影响,我们可以分条件开启error-prone,即
具体的做法是通过想gradle传递参数来实现。简易代码如下。
1 2 3 4 5 6 7 8 9 | allprojects { repositories { jcenter() } //如果接受的参数有enableErrorProne则应用插件,否则不应用 if (project.hasProperty("enableErrorProne")) { apply plugin: "net.ltgt.errorprone" } } |
---|
使用如下,则会开启应用插件
1 | ./gradlew assembleDebug -PenableErrorProne |
---|
以上就是关于error-prone的一些简单总结。Error-prone在Flipboard中已经应用很久,采用的方式为开发构建时不开启,在持续集成时开启。大家可根据自己和团队的需要选择并应用error-prone,来快速发现问题并改善代码的质量。