本文主要介紹以下內容:
(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 的相關內容解析完了,如有錯誤地方或不足之處,歡迎指出,謝謝^_^!