Android 代碼規(guī)范神器 :CheckStyle使用全面解析

本文主要介紹以下內(nèi)容:

(1)CheckStyle詳細(xì)使用

(2)如何定制專屬CheckStyle檢查規(guī)則

(3)如何定制專屬CodeStyle

(4)如何有效的FormatCode

一骏庸、CheckStyle 使用


? ? ? ?CheckStyle 可以通過插件和gradle腳本兩種方式來實(shí)現(xiàn)昏翰,對(duì)于gradle腳本而言篮昧,只需要配置好CheckStyle 的gradle腳本譬重,運(yùn)行g(shù)radle task 即可輸出掃描結(jié)果(html/xml兩種格式),因此,本文將重點(diǎn)介紹CheckStyle-IDE插件使用籽御。

CheckStyle插件使用步驟如下:

(1)安裝CheckStyle-IDE插件

(2)添加檢查規(guī)則文件

添加CheckStyle檢查規(guī)則文件

(3)CheckStyle-IDE 插件使用

? ? ? ?在AS上打開CheckStyle 插件操作面板,面板內(nèi)容如下圖所示惰匙,主要包括:檢查規(guī)則選擇(自帶一個(gè)默認(rèn)規(guī)則)技掏、掃描范圍選擇 (current file、Module项鬼、project哑梳、files Chaged (這個(gè)很重要))、刷新等操作

checkStyle 操作面板

(4)CheckStyle掃描結(jié)果

CheckStyle掃描結(jié)果

(5)根據(jù)CheckStyle掃描結(jié)果對(duì)應(yīng)修改

? ? ? 重復(fù)(3)~(5)修改完即可


CheckStyle gradle腳本配置如下:

CheckStyle腳本配置主要包括:CheckStyle 版本绘盟、配置檢查規(guī)則文件鸠真、設(shè)定CheckStyle檢查范圍、CheckStyle掃描結(jié)果輸出方式等等龄毡。

備注 :記得添加 classpath 'com.puppycrawl.tools:checkstyle:7.1.2' (不添加吠卷,高版本gradle 會(huì)有問題)

checkStyle gradle腳本配置

二、如何定制專屬CheckStyle檢查規(guī)則


? ? ? ?CheckStyle不管是插件方式還是腳本方式沦零,使用都是相當(dāng)方便快捷的祭隔,而難點(diǎn)在于如何定制專屬于我們項(xiàng)目的CheckStyle檢查規(guī)則。

定制CheckStyle規(guī)則大致思路:

通過對(duì)Google 提供的checkStyle檢查規(guī)則修改完善路操,打造出屬于自己的檢查規(guī)則

地址:Google checkStyle 檢查規(guī)則

(1)全面解析CheckStyle 檢查規(guī)則

? ? ? ? CheckStyle檢查規(guī)則是基于XML配置文件的疾渴,主要通過XML文件中的module對(duì)檢查規(guī)則進(jìn)行配置。在XML文件中屯仗,被指定的module搞坝,都將被對(duì)應(yīng)規(guī)則檢查;

? ? ? ?具體對(duì)應(yīng)檢查項(xiàng)及規(guī)則可以參考:CheckStyle 官網(wǎng)

(2)全面解析檢查規(guī)則文件checkStyle.xml

在XML中主要由module 魁袜、property桩撮、message等節(jié)點(diǎn)構(gòu)成:

最好舉個(gè)例子說明

(1)module節(jié)點(diǎn)

module 主要是指檢查項(xiàng)敦第,如MethodName (檢查方法命名)

module中有兩個(gè)比較重要的節(jié)點(diǎn),它們分別是Checker(checkStyle配置文件的根節(jié)點(diǎn)店量,必須存在)申尼、TreeWalker(樹遍歷器),TreeWalker會(huì)自動(dòng)去檢查指定范圍內(nèi)的每一個(gè)java源文件垫桂,TreeWalker內(nèi)部會(huì)定義很多module。

module的根節(jié)點(diǎn)是Checker粟按,一定要有诬滩;

(2)property節(jié)點(diǎn)

對(duì)應(yīng)module 檢查項(xiàng)中具體檢查屬性,如果使用默認(rèn)值灭将,property節(jié)點(diǎn)可以省略疼鸟;

(3)message節(jié)點(diǎn)

checkStyle檢查出來,是否打印出message消息庙曙,message節(jié)點(diǎn)可以省略

(3)如何添加過濾能力

? ? ? ?根據(jù)(1)~(2)空镜,定制好了屬于自己的CheckStyle檢查規(guī)則,然后使用CheckStyle-IDE進(jìn)行掃描后捌朴,發(fā)現(xiàn)協(xié)議文件(通過平臺(tái)工具將jce協(xié)議文件轉(zhuǎn)化成java代碼)被檢查出來很多問題吴攒,那怎么才能讓CheckStyle 不對(duì)這部分代碼進(jìn)行規(guī)則檢查了。

解決辦法:

在定制好的checkStyle.xml文件中砂蔽,添加一個(gè)名為SuppressionFilter的moudle洼怔,在過濾規(guī)則文件suppressions.xml中添加相應(yīng)的過濾規(guī)則。

在checkStyle.xml 中添加 SuppressionFilter

在checkStyle.xml文件中添加過濾文件

suppressions.xml 為過濾規(guī)則相關(guān)文件:

目前可添加的過濾能力有:

(1)對(duì)某個(gè)java文件左驾,過濾某項(xiàng)或多項(xiàng)規(guī)則檢查

(2)對(duì)某個(gè)java文件镣隶,過濾所有文件檢查

(3)對(duì)某個(gè)包下的所有java文件,過濾某項(xiàng)或多項(xiàng)規(guī)則檢查

(4)對(duì)某個(gè)包下的所有java文件诡右,過濾所有文件檢查

? ? ?對(duì)協(xié)議包進(jìn)行過濾檢查是相當(dāng)有用的

suppressisons.xml文件內(nèi)容

? ? ? ?是否還能將過濾能力加強(qiáng)了安岂,如對(duì)某個(gè)java文件中的某段代碼進(jìn)行某個(gè)規(guī)則過濾了 ?

解決辦法肯定有的帆吻,目前通過suppressions.xml文件確實(shí)無能為力了域那,但是我們卻可以通過注解方式來達(dá)到上述目的。

使用@SuppressWarningFilter注解來過濾某些檢查項(xiàng):

1)在checkStyle.xml規(guī)則文件中添加 @SuppressWarningFilter注解能力

添加SuppressWarningFilter注解能力

2)實(shí)例

局部變量命名違反規(guī)則猜煮,不能使用單個(gè)字母進(jìn)行命名

使用SuppressWarningsFilter注解前

3)使用@SuppressWarningFilter注解后

? ? ? ?使用@SuppressWarningFilter("checkstyle:LocalVariableName")注解后琉雳,CheckStyle下次掃描時(shí),會(huì)將其過濾友瘤。

使用SuppressWarningsFilter注解后

(4)沒事多看看CheckStyle 源碼

? ? ? ?有人可能抱怨到翠肘,Google 的checkStyle.xml規(guī)則太多,對(duì)照CheckStyle官網(wǎng)說明有時(shí)也找半天辫秧,看的也不是很明白束倍,那有沒有什么辦法可以了解更快更全了?

? ? ? 有,那就直接看CheckStyle 的源碼即可绪妹,地址:Github CheckStyle源碼 地址甥桂。

如,現(xiàn)在想查找CheckStyle 關(guān)于縮進(jìn)(Indentation)的規(guī)則邮旷,直接上在上述地址搜索框搜索:Indetation :

checkstyle/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/IndentationCheck.java

Indentation(注釋很詳細(xì)):

Indentation check 對(duì)應(yīng)屬性
默認(rèn)縮進(jìn)

? ? ? 是不是一目了然黄选,沒事多看看源碼,肯定沒錯(cuò)的婶肩。

三办陷、如何定制專屬CodeStyle


為什么要定制codeStyle了?

一是保證與checkStyle.xml中規(guī)則保持一致性律歼;

二是保證項(xiàng)目組成員使用同樣一份codeStyle 民镜,風(fēng)格一致性 ;

最終輸出自定義Code Style 文件:radio_code_style.xml

Code style 導(dǎo)入導(dǎo)出 :

Code Style 配置面板

3.1 Code Style-java 配置

CodeStyle java 主要包括以下幾個(gè)部分:

(1)Tabs and Indents (Tab 和縮進(jìn))

? ? ? ? ?Tab和縮進(jìn)使用默認(rèn)就可以

(2)Spaces (空格)

? ? ? ? Spaces 主要包括圓括號(hào)险毁、操作符 制圈、關(guān)鍵字、大括號(hào)等左右空格問題畔况,使用默認(rèn)配置即可鲸鹦。

Spaces 配置項(xiàng)

(3)Wrapping and Braces (大括號(hào)及其包裹內(nèi)容)

? ? ? 支持自動(dòng)換行(超過line_max =200 ,后面將會(huì)介紹)跷跪;

? ? ?if亥鬓,while 等關(guān)鍵字自動(dòng)帶上大括號(hào) (format時(shí)進(jìn)行);

? ? ?builder模式 "."號(hào)自動(dòng)對(duì)齊 等等配置

Wrapping and Braces

(4)Blank Lines

? ? ? ?使用默認(rèn)配置

(5)Java Doc 默認(rèn)

Java Doc

(6)Imports

根據(jù)需要域庇,調(diào)整Imports 順序

Imports

(7)Arrangement 排序規(guī)則 (默認(rèn))

Arrangement

(8)Code Generation

在Field 前面添加 m前綴 嵌戈,在 static field 前面添加s前綴

Code Generation

另外,我們還可以在CodeStyle中配置 Line_max

Line_max=200

? ? ? ?每行不超過200字符


? ? ? ?一眼看過去听皿,里面配置項(xiàng)很多熟呛,對(duì)應(yīng)的含義也不是很明白,那就去看看官方code_style_java文檔尉姨。

如:Wrapping options選項(xiàng) 含義

Wrapping options選項(xiàng) 含義

3.2 其他比較實(shí)用的設(shè)置(不在Code Style 范圍內(nèi))

(1)Overly long method (方法過長(zhǎng))

Overly long method

默認(rèn)情況:Severty(嚴(yán)重程度)為Waning庵朝,默認(rèn)行數(shù)限制30

可以修改提示對(duì)應(yīng)的Severty級(jí)別和行數(shù) ,與Check Style 保持一致

(2)自動(dòng)換行

自動(dòng)換行

(3)自動(dòng)清除 unused import

在開發(fā)過程當(dāng)中又厉,經(jīng)常碰到無用的Import需要清理或者新增類需要添加Import九府,這時(shí)候要么遺忘刪除,導(dǎo)致產(chǎn)生無用的代碼行覆致,或者需要使用快捷鍵新增拱镐,非常不方便尖坤,Android Studio自身就提供自動(dòng)處理功能塞耕。

自動(dòng)清除 unused import

四、如何有效的Format Code


? ? ? 在前面第二宣羊、三部分 我們已經(jīng)完成了CheckStyle檢查規(guī)則和CodeStyle的定制,考慮到之前組內(nèi)同事使用了不同的codeStyle.xml汰蜘,所以在修改CheckStyle掃描問題前仇冯,需要對(duì)項(xiàng)目代碼進(jìn)行整體format(使用新的codeStyle.xml),萬能的AS提供了這種能力族操,即Reformat code苛坚。

Reformat code 功能如下圖所示:

(1)Options 優(yōu)化項(xiàng) (默認(rèn)都沒有選擇)

主要包括 imports 、rearrange色难、VCS 等優(yōu)化

Reformat code (全局)

(2)Filters 功能

? ? ? 主要包括泼舱,范圍和文件類型

(3)reformat code (current file)

reformat code (current file)

(4)VCS 前配置自動(dòng)執(zhí)行 (暫時(shí)不需要,我們需要Code 前)

commit 前需要進(jìn)行的相關(guān)操作

(5)指出Reformat code 的Scope 范圍選擇功能

? 自定義Scope

自定義Scope

? ? ? ?為什么需要自定義Scope 范圍了莱预,如有些文件,協(xié)議類 (不在Check Style 掃描檢查范圍內(nèi))项滑,不需要再對(duì)其Reformat code依沮。

? ? ?但是必須指出的是,對(duì)整個(gè)項(xiàng)目Reformat Code 次數(shù)并不多枪狂,因此不需要對(duì)其進(jìn)行范圍設(shè)置危喉。

? ? ?因此,對(duì)整個(gè)項(xiàng)目進(jìn)行format的時(shí)候州疾,選擇 Scope = Projects Files 辜限,然后回滾一下 協(xié)議包下面的修改即可。


至此严蓖,關(guān)于CheckStyle 的相關(guān)內(nèi)容解析完了薄嫡,如有錯(cuò)誤地方或不足之處,歡迎指出颗胡,謝謝^_^!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毫深,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毒姨,更是在濱河造成了極大的恐慌哑蔫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弧呐,死亡現(xiàn)場(chǎng)離奇詭異闸迷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)俘枫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門腥沽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸠蚪,你說我怎么就攤上這事巡球⊙糟澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵酣栈,是天一觀的道長(zhǎng)险胰。 經(jīng)常有香客問我,道長(zhǎng)矿筝,這世上最難降的妖魔是什么起便? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮窖维,結(jié)果婚禮上榆综,老公的妹妹穿的比我還像新娘。我一直安慰自己铸史,他們只是感情好鼻疮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳轿,像睡著了一般判沟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崭篡,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天挪哄,我揣著相機(jī)與錄音,去河邊找鬼琉闪。 笑死迹炼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颠毙。 我是一名探鬼主播斯入,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛀蜜!你這毒婦竟也來了咱扣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤涵防,失蹤者是張志新(化名)和其女友劉穎闹伪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壮池,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偏瓤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椰憋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厅克。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖橙依,靈堂內(nèi)的尸體忽然破棺而出证舟,到底是詐尸還是另有隱情硕旗,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布女责,位于F島的核電站漆枚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抵知。R本人自食惡果不足惜墙基,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刷喜。 院中可真熱鬧残制,春花似錦、人聲如沸掖疮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浊闪。三九已至恼布,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間规揪,已是汗流浹背桥氏。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工温峭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猛铅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓凤藏,卻偏偏與公主長(zhǎng)得像奸忽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揖庄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1 背景 一個(gè)項(xiàng)目開發(fā)必然會(huì)涉及團(tuán)隊(duì)協(xié)作栗菜,而工程質(zhì)量就需要團(tuán)隊(duì)去保證。一般我們期望的代碼:無潛在風(fēng)險(xiǎn)蹄梢、無重復(fù)邏輯疙筹、...
    zyl06閱讀 3,217評(píng)論 5 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)禁炒,斷路器而咆,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • 轉(zhuǎn)自:https://source.android.com/devices/graphics/?hl=zh-cn ...
    uin_sisyphus閱讀 1,090評(píng)論 0 1