Android 代码规范神器 :CheckStyle使用全面解析
本文主要介绍以下内容:
(1)CheckStyle详细使用
(2)如何定制专属CheckStyle检查规则
(3)如何定制专属CodeStyle
(4)如何有效的FormatCode
一、CheckStyle 使用
CheckStyle 可以通过插件和gradle脚本两种方式来实现,对于gradle脚本而言,只需要配置好CheckStyle 的gradle脚本,运行gradle task 即可输出扫描结果(html/xml两种格式),因此,本文将重点介绍CheckStyle-IDE插件使用。
CheckStyle插件使用步骤如下:
(1)安装CheckStyle-IDE插件
(2)添加检查规则文件
![](https://img.haomeiwen.com/i3315418/4639dcedbcb15a3d.jpg)
(3)CheckStyle-IDE 插件使用
在AS上打开CheckStyle 插件操作面板,面板内容如下图所示,主要包括:检查规则选择(自带一个默认规则)、扫描范围选择 (current file、Module、project、files Chaged (这个很重要))、刷新等操作
![](http://upload-images.jianshu.io/upload_images/3315418-f0940efba468abf0.jpg)
(4)CheckStyle扫描结果
![](http://upload-images.jianshu.io/upload_images/3315418-3ff5ebe121a38643.jpg)
(5)根据CheckStyle扫描结果对应修改
重复(3)~(5)修改完即可
CheckStyle gradle脚本配置如下:
CheckStyle脚本配置主要包括:CheckStyle 版本、配置检查规则文件、设定CheckStyle检查范围、CheckStyle扫描结果输出方式等等。
备注 :记得添加 classpath 'com.puppycrawl.tools:checkstyle:7.1.2' (不添加,高版本gradle 会有问题)
![](http://upload-images.jianshu.io/upload_images/3315418-7729f08896c5dd00.jpg)
二、如何定制专属CheckStyle检查规则
CheckStyle不管是插件方式还是脚本方式,使用都是相当方便快捷的,而难点在于如何定制专属于我们项目的CheckStyle检查规则。
定制CheckStyle规则大致思路:
通过对Google 提供的checkStyle检查规则修改完善,打造出属于自己的检查规则
(1)全面解析CheckStyle 检查规则
CheckStyle检查规则是基于XML配置文件的,主要通过XML文件中的module对检查规则进行配置。在XML文件中,被指定的module,都将被对应规则检查;
具体对应检查项及规则可以参考:CheckStyle 官网
(2)全面解析检查规则文件checkStyle.xml
在XML中主要由module 、property、message等节点构成:
最好举个例子说明
(1)module节点
module 主要是指检查项,如MethodName (检查方法命名)
module中有两个比较重要的节点,它们分别是Checker(checkStyle配置文件的根节点,必须存在)、TreeWalker(树遍历器),TreeWalker会自动去检查指定范围内的每一个java源文件,TreeWalker内部会定义很多module。
module的根节点是Checker,一定要有;
(2)property节点
对应module 检查项中具体检查属性,如果使用默认值,property节点可以省略;
(3)message节点
checkStyle检查出来,是否打印出message消息,message节点可以省略
(3)如何添加过滤能力
根据(1)~(2),定制好了属于自己的CheckStyle检查规则,然后使用CheckStyle-IDE进行扫描后,发现协议文件(通过平台工具将jce协议文件转化成java代码)被检查出来很多问题,那怎么才能让CheckStyle 不对这部分代码进行规则检查了。
解决办法:
在定制好的checkStyle.xml文件中,添加一个名为SuppressionFilter的moudle,在过滤规则文件suppressions.xml中添加相应的过滤规则。
在checkStyle.xml 中添加 SuppressionFilter
![](http://upload-images.jianshu.io/upload_images/3315418-0683b260c0ea471a.jpg)
suppressions.xml 为过滤规则相关文件:
目前可添加的过滤能力有:
(1)对某个java文件,过滤某项或多项规则检查
(2)对某个java文件,过滤所有文件检查
(3)对某个包下的所有java文件,过滤某项或多项规则检查
(4)对某个包下的所有java文件,过滤所有文件检查
对协议包进行过滤检查是相当有用的
![](http://upload-images.jianshu.io/upload_images/3315418-e53d60b60e37314e.jpg)
是否还能将过滤能力加强了,如对某个java文件中的某段代码进行某个规则过滤了 ?
解决办法肯定有的,目前通过suppressions.xml文件确实无能为力了,但是我们却可以通过注解方式来达到上述目的。
使用@SuppressWarningFilter注解来过滤某些检查项:
1)在checkStyle.xml规则文件中添加 @SuppressWarningFilter注解能力
![](http://upload-images.jianshu.io/upload_images/3315418-52cf856c95771d93.jpg)
2)实例
局部变量命名违反规则,不能使用单个字母进行命名
![](http://upload-images.jianshu.io/upload_images/3315418-625f37c16c014b2c.jpg)
3)使用@SuppressWarningFilter注解后
使用@SuppressWarningFilter("checkstyle:LocalVariableName")注解后,CheckStyle下次扫描时,会将其过滤。
![](http://upload-images.jianshu.io/upload_images/3315418-9c77873a4e5ee509.jpg)
(4)没事多看看CheckStyle 源码
有人可能抱怨到,Google 的checkStyle.xml规则太多,对照CheckStyle官网说明有时也找半天,看的也不是很明白,那有没有什么办法可以了解更快更全了?
有,那就直接看CheckStyle 的源码即可,地址:Github CheckStyle源码 地址。
如,现在想查找CheckStyle 关于缩进(Indentation)的规则,直接上在上述地址搜索框搜索:Indetation :
checkstyle/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/IndentationCheck.java
Indentation(注释很详细):
![](http://upload-images.jianshu.io/upload_images/3315418-bde563e6047d8f9c.png)
![](http://upload-images.jianshu.io/upload_images/3315418-34511110df4c998d.png)
是不是一目了然,没事多看看源码,肯定没错的。
三、如何定制专属CodeStyle
为什么要定制codeStyle了?
一是保证与checkStyle.xml中规则保持一致性;
二是保证项目组成员使用同样一份codeStyle ,风格一致性 ;
最终输出自定义Code Style 文件:radio_code_style.xml
Code style 导入导出 :
![](http://upload-images.jianshu.io/upload_images/3315418-6502ba991b37bce2.jpg)
3.1 Code Style-java 配置
CodeStyle java 主要包括以下几个部分:
(1)Tabs and Indents (Tab 和缩进)
Tab和缩进使用默认就可以
(2)Spaces (空格)
Spaces 主要包括圆括号、操作符 、关键字、大括号等左右空格问题,使用默认配置即可。
![](http://upload-images.jianshu.io/upload_images/3315418-8abc1c3aef70b4c6.jpg)
(3)Wrapping and Braces (大括号及其包裹内容)
支持自动换行(超过line_max =200 ,后面将会介绍);
if,while 等关键字自动带上大括号 (format时进行);
builder模式 "."号自动对齐 等等配置
![](http://upload-images.jianshu.io/upload_images/3315418-6f7ec460fc9dce8c.jpg)
(4)Blank Lines
使用默认配置
(5)Java Doc 默认
![](http://upload-images.jianshu.io/upload_images/3315418-485cf9192e33c81d.jpg)
(6)Imports
根据需要,调整Imports 顺序
![](http://upload-images.jianshu.io/upload_images/3315418-703b89d2ee3662bb.jpg)
(7)Arrangement 排序规则 (默认)
![](http://upload-images.jianshu.io/upload_images/3315418-fdaf92a19e3f410c.jpg)
(8)Code Generation
在Field 前面添加 m前缀 ,在 static field 前面添加s前缀
![](http://upload-images.jianshu.io/upload_images/3315418-cfb49b37c89bdb9d.jpg)
另外,我们还可以在CodeStyle中配置 Line_max
![](http://upload-images.jianshu.io/upload_images/3315418-a1e60890a3ab28a9.jpg)
每行不超过200字符
一眼看过去,里面配置项很多,对应的含义也不是很明白,那就去看看官方code_style_java文档。
如:Wrapping options选项 含义
![](http://upload-images.jianshu.io/upload_images/3315418-5c8755036e4d9694.png)
3.2 其他比较实用的设置(不在Code Style 范围内)
(1)Overly long method (方法过长)
![](http://upload-images.jianshu.io/upload_images/3315418-9e85802ed5e99808.jpg)
默认情况:Severty(严重程度)为Waning,默认行数限制30
可以修改提示对应的Severty级别和行数 ,与Check Style 保持一致
(2)自动换行
![](http://upload-images.jianshu.io/upload_images/3315418-3a1b3797de7297a2.jpg)
(3)自动清除 unused import
在开发过程当中,经常碰到无用的Import需要清理或者新增类需要添加Import,这时候要么遗忘删除,导致产生无用的代码行,或者需要使用快捷键新增,非常不方便,Android Studio自身就提供自动处理功能。
![](http://upload-images.jianshu.io/upload_images/3315418-99be996d2d8a6839.jpg)
四、如何有效的Format Code
在前面第二、三部分 我们已经完成了CheckStyle检查规则和CodeStyle的定制,考虑到之前组内同事使用了不同的codeStyle.xml,所以在修改CheckStyle扫描问题前,需要对项目代码进行整体format(使用新的codeStyle.xml),万能的AS提供了这种能力,即Reformat code。
Reformat code 功能如下图所示:
(1)Options 优化项 (默认都没有选择)
主要包括 imports 、rearrange、VCS 等优化
![](http://upload-images.jianshu.io/upload_images/3315418-26e498abe6c4426e.jpg)
(2)Filters 功能
主要包括,范围和文件类型
(3)reformat code (current file)
![](http://upload-images.jianshu.io/upload_images/3315418-20ffb9f8958270ed.jpg)
(4)VCS 前配置自动执行 (暂时不需要,我们需要Code 前)
![](http://upload-images.jianshu.io/upload_images/3315418-0c3686570a0f4e91.jpg)
(5)指出Reformat code 的Scope 范围选择功能
自定义Scope
![](http://upload-images.jianshu.io/upload_images/3315418-9f35c027691733cd.jpg)
为什么需要自定义Scope 范围了,如有些文件,协议类 (不在Check Style 扫描检查范围内),不需要再对其Reformat code。
但是必须指出的是,对整个项目Reformat Code 次数并不多,因此不需要对其进行范围设置。
因此,对整个项目进行format的时候,选择 Scope = Projects Files ,然后回滚一下 协议包下面的修改即可。
至此,关于CheckStyle 的相关内容解析完了,如有错误地方或不足之处,欢迎指出,谢谢^_^!