本文主要介绍以下内容:
(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)添加检查规则文件
(3)CheckStyle-IDE 插件使用
在AS上打开CheckStyle 插件操作面板,面板内容如下图所示,主要包括:检查规则选择(自带一个默认规则)、扫描范围选择 (current file、Module、project、files Chaged (这个很重要))、刷新等操作
(4)CheckStyle扫描结果
(5)根据CheckStyle扫描结果对应修改
重复(3)~(5)修改完即可
CheckStyle gradle脚本配置如下:
CheckStyle脚本配置主要包括:CheckStyle 版本、配置检查规则文件、设定CheckStyle检查范围、CheckStyle扫描结果输出方式等等。
备注 :记得添加 classpath 'com.puppycrawl.tools:checkstyle:7.1.2' (不添加,高版本gradle 会有问题)
二、如何定制专属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
suppressions.xml 为过滤规则相关文件:
目前可添加的过滤能力有:
(1)对某个java文件,过滤某项或多项规则检查
(2)对某个java文件,过滤所有文件检查
(3)对某个包下的所有java文件,过滤某项或多项规则检查
(4)对某个包下的所有java文件,过滤所有文件检查
对协议包进行过滤检查是相当有用的
是否还能将过滤能力加强了,如对某个java文件中的某段代码进行某个规则过滤了 ?
解决办法肯定有的,目前通过suppressions.xml文件确实无能为力了,但是我们却可以通过注解方式来达到上述目的。
使用@SuppressWarningFilter注解来过滤某些检查项:
1)在checkStyle.xml规则文件中添加 @SuppressWarningFilter注解能力
2)实例
局部变量命名违反规则,不能使用单个字母进行命名
3)使用@SuppressWarningFilter注解后
使用@SuppressWarningFilter("checkstyle:LocalVariableName")注解后,CheckStyle下次扫描时,会将其过滤。
(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(注释很详细):
是不是一目了然,没事多看看源码,肯定没错的。
三、如何定制专属CodeStyle
为什么要定制codeStyle了?
一是保证与checkStyle.xml中规则保持一致性;
二是保证项目组成员使用同样一份codeStyle ,风格一致性 ;
最终输出自定义Code Style 文件:radio_code_style.xml
Code style 导入导出 :
3.1 Code Style-java 配置
CodeStyle java 主要包括以下几个部分:
(1)Tabs and Indents (Tab 和缩进)
Tab和缩进使用默认就可以
(2)Spaces (空格)
Spaces 主要包括圆括号、操作符 、关键字、大括号等左右空格问题,使用默认配置即可。
(3)Wrapping and Braces (大括号及其包裹内容)
支持自动换行(超过line_max =200 ,后面将会介绍);
if,while 等关键字自动带上大括号 (format时进行);
builder模式 "."号自动对齐 等等配置
(4)Blank Lines
使用默认配置
(5)Java Doc 默认
(6)Imports
根据需要,调整Imports 顺序
(7)Arrangement 排序规则 (默认)
(8)Code Generation
在Field 前面添加 m前缀 ,在 static field 前面添加s前缀
另外,我们还可以在CodeStyle中配置 Line_max
每行不超过200字符
一眼看过去,里面配置项很多,对应的含义也不是很明白,那就去看看官方code_style_java文档。
如:Wrapping options选项 含义
3.2 其他比较实用的设置(不在Code Style 范围内)
(1)Overly long method (方法过长)
默认情况:Severty(严重程度)为Waning,默认行数限制30
可以修改提示对应的Severty级别和行数 ,与Check Style 保持一致
(2)自动换行
(3)自动清除 unused import
在开发过程当中,经常碰到无用的Import需要清理或者新增类需要添加Import,这时候要么遗忘删除,导致产生无用的代码行,或者需要使用快捷键新增,非常不方便,Android Studio自身就提供自动处理功能。
四、如何有效的Format Code
在前面第二、三部分 我们已经完成了CheckStyle检查规则和CodeStyle的定制,考虑到之前组内同事使用了不同的codeStyle.xml,所以在修改CheckStyle扫描问题前,需要对项目代码进行整体format(使用新的codeStyle.xml),万能的AS提供了这种能力,即Reformat code。
Reformat code 功能如下图所示:
(1)Options 优化项 (默认都没有选择)
主要包括 imports 、rearrange、VCS 等优化
(2)Filters 功能
主要包括,范围和文件类型
(3)reformat code (current file)
(4)VCS 前配置自动执行 (暂时不需要,我们需要Code 前)
(5)指出Reformat code 的Scope 范围选择功能
自定义Scope
为什么需要自定义Scope 范围了,如有些文件,协议类 (不在Check Style 扫描检查范围内),不需要再对其Reformat code。
但是必须指出的是,对整个项目Reformat Code 次数并不多,因此不需要对其进行范围设置。
因此,对整个项目进行format的时候,选择 Scope = Projects Files ,然后回滚一下 协议包下面的修改即可。
至此,关于CheckStyle 的相关内容解析完了,如有错误地方或不足之处,欢迎指出,谢谢^_^!