之前用sonar檢測代碼,發現很不方便,每次都需要手動檢測。然後就發現了checkstyle
CheckStyle的主要功能就是實時檢測,代碼的規範(Code Style)是否符合我們規定的一個模板,如代碼和括號之間沒有空格, 類中導入的包沒有使用等,當發現這些不符合這些規範時,它就報一個警告或者錯誤等提示,導致編譯不通過。
一、添加插件
二、配置
如下修改Project的build.gradle文件
apply plugin: 'checkstyle'
task checkstyle(type: Checkstyle) {
source 'src'
include '**/*.java'
exclude '**/gen/**'
exclude '**/test/**'
exclude '**/androidTest/**'
configFile new File(rootDir, "checkstyle.xml")
classpath = files()
}
設置配置文件checkstyle.xml,定義我們想要校驗的內容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">
<module name="Checker">
<property name="charset" value="UTF-8" />
<property name="severity" value="error" />
<!-- Checks for Size Violations. -->
<!-- 檢查文件的長度(行) default max=2500 -->
<module name="FileLength">
<property name="max" value="3000" />
<property name="severity" value="warning" />
</module>
<!-- 檢查源碼中沒有製表符('\t') -->
<module name="FileTabCharacter">
<property name="eachLine" value="true" />
</module>
<module name="TreeWalker">
<module name="SuppressWarningsHolder" />
<!--空格檢測-->
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true" />
<property name="allowEmptyMethods" value="true" />
<property name="allowEmptyTypes" value="true" />
<property name="allowEmptyLoops" value="true" />
<message key="ws.notFollowed"
value="WhitespaceAround: ''{0}'' is not followed by whitespace." />
<message key="ws.notPreceded"
value="WhitespaceAround: ''{0}'' is not preceded with whitespace." />
</module>
<module name="GenericWhitespace">
<message key="ws.followed"
value="GenericWhitespace ''{0}'' is followed by whitespace." />
<message key="ws.preceded"
value="GenericWhitespace ''{0}'' is preceded with whitespace." />
<message key="ws.illegalFollow"
value="GenericWhitespace ''{0}'' should followed by whitespace." />
<message key="ws.notPreceded"
value="GenericWhitespace ''{0}'' is not preceded with whitespace." />
</module>
<!-- Checks for imports -->
<!-- 必須導入類的完整路徑,即不能使用*導入所需的類 -->
<module name="AvoidStarImport" />
<!-- 檢查是否從非法的包中導入了類 illegalPkgs: 定義非法的包名稱-->
<module name="IllegalImport" /> <!-- defaults to sun.* packages -->
<!-- 檢查是否導入了不必顯示導入的類-->
<module name="RedundantImport" />
<!-- 檢查是否導入的包沒有使用-->
<module name="UnusedImports" />
<!-- 檢查代碼塊的左花括號的放置位置 -->
<module name="LeftCurly">
<property name="option" value="eol" />
</module>
<!--檢查代碼塊周圍是否有大括號,可以檢查do、else、if、for、while等關鍵字所控制的代碼塊-->
<module name="NeedBraces">
<property name="tokens"
value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_WHILE" /> <!-- LITERAL_IF 不檢測-->
<property name="allowSingleLineStatement" value="true" />
</module>
<!--檢查else、try、catch標記的代碼塊的右花括號的放置位置-->
<module name="RightCurly">
<property name="id" value="RightCurlySame" />
<property name="tokens"
value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO" />
</module>
<module name="RightCurly">
<property name="id" value="RightCurlyAlone" />
<property name="option" value="alone" />
<property name="tokens"
value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT" />
</module>
<!-- 檢查在重寫了equals方法後是否重寫了hashCode方法 -->
<module name="EqualsHashCode" />
<!--檢查是否有不合法的實例化操作,是否使用工廠方法更好-->
<module name="IllegalInstantiation">
<property name="classes" value="java.lang.Boolean" />
</module>
<!--檢查Java代碼的縮進是否正確-->
<module name="Indentation">
<property name="arrayInitIndent" value="8" />
</module>
<module name="SimplifyBooleanExpression" />
<module name="SimplifyBooleanReturn" />
<!--檢查每個變量是否使用一行一條語句進行聲明-->
<!--<module name="MultipleVariableDeclarations" />-->
<!--檢查數組定義的風格,默認java風格-->
<module name="ArrayTypeStyle" />
<!--檢查long類型的常量在定義時是否由大寫的“L”開頭-->
<module name="UpperEll" />
<!--檢查switch中case後是否加入了跳出語句,例如:return、break、throw、continue -->
<module name="FallThrough" />
<!-- Checks the number of parameters of a method or constructor. max default 7個. -->
<module name="ParameterNumber">
<property name="max" value="19" />
</module>
<!-- 每行字符數 -->
<module name="LineLength">
<property name="max" value="250" />
</module>
<!-- Checks for long methods and constructors. max default 150行. max=300 設置長度300 -->
<module name="MethodLength">
<property name="max" value="200" />
</module>
<!-- ModifierOrder 檢查修飾符的順序,默認是 public,protected,private,abstract,static,final,transient,volatile,synchronized,native -->
<module name="ModifierOrder" />
<!-- 檢查是否有多餘的修飾符,例如:接口中的方法不必使用public、abstract修飾 -->
<!--<module name="RedundantModifier">-->
<!--</module>-->
<!--- 字符串比較必須使用 equals() -->
<module name="StringLiteralEquality" />
<!--限制try代碼塊的嵌套層數(默認值爲1)-->
<module name="NestedTryDepth">
<property name="max" value="2" />
</module>
<!-- 返回個數 -->
<module name="ReturnCount">
<property name="max" value="15" />
<property name="maxForVoid" value="15" />
<property name="format" value="^$" />
</module>
</module>
</module>
設置在Run之前執行checkstyle
1.選擇菜單Run–Edit Configurations
2.選擇Android Application–app,然後點擊Before Launch區域的綠色加號
3.點擊下拉菜單Gradle-aware Make,出現如下輸入對話框
4.輸入checkstyle,然後從聯想列表中選擇對應的checkstyle,保存。
5.再次運行就可以從Gradle Console中看到有checkstyle任務先執行了。
注意:如果上面的checkstyle失敗,則不進行後續的run操作。