gradle checkstyle配置

本文介绍了一种通过配置Checkstyle来改善Android项目的代码质量和语法的方法。包括详细的Checkstyle配置示例,涉及代码规范、命名规则、注释规范等多个方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置代码质量检查:http://vincentbrison.com/2014/07/19/how-to-improve-quality-and-syntax-of-your-android-code/#Presentation

<?xml version="1.0"?>

<!DOCTYPE suppressions PUBLIC
    "-//Puppy Crawl//DTD Suppressions 1.1//EN"
    "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">

<suppressions>
    <suppress checks="IllegalTokenText"
              files="CommonUtil.java"/>
    <suppress checks="AvoidEscapedUnicodeCharacters"
              files="CommonUtil.java"/>

    <suppress checks="MethodName"
              files="CommonUtil.java"/>
</suppressions>
checkstyle {
    toolVersion '6.11.1'
    showViolations true
}
check.dependsOn 'checkstyle'

task checkstyle(type: Checkstyle) {
    configFile file("${project.projectDir}/config/quality/checkstyle.xml")
    // Where my checkstyle config is...
    configProperties.checkstyleSuppressionsPath = file("${project.projectDirr}/config/quality/suppressions.xml").absolutePath // Where is my suppressions file for checkstyle is...
    source 'src'
    include '**/*.java'
    exclude '**/gen/**'
    exclude "**/test/**"
    classpath = files()
}

狠一点可以在build.gradle里加上下面这个,每次构建都会检查

project.afterEvaluate {
    preBuild.dependsOn 'checkstyle'
}
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<!--
    Checkstyle configuration that checks the Google coding conventions from Google Java Style
    that can be found at https://google.github.io/styleguide/javaguide.html.
    Checkstyle is very configurable. Be sure to read the documentation at
    http://checkstyle.sf.net (or in your downloaded distribution).
    To completely disable a check, just comment it out or delete it from the file.
    Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
 -->

<module name="Checker">
    <property name="charset" value="UTF-8"/>

    <property name="severity" value="warning"/>

    <!--<property name="fileExtensions" value="java, properties, xml"/>-->
    <!-- Checks for whitespace                               -->
    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>

    <module name="TreeWalker">
        <module name="OuterTypeFilename"/>
        <module name="IllegalTokenText">
            <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
            <property name="format"
                      value="\\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
            <property name="message" value="Avoid using corresponding octal or Unicode escape."/>
        </module>
        <module name="AvoidEscapedUnicodeCharacters">
            <property name="allowEscapesForControlCharacters" value="true"/>
            <property name="allowByTailComment" value="true"/>
            <property name="allowNonPrintableEscapes" value="true"/>
        </module>
        <!--单行最大长度,google100,修改-->
        <module name="LineLength">
            <property name="max" value="200"/>
            <property name="ignorePattern"
                      value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
        </module>
        <module name="AvoidStarImport"/><!--import要指明到类 不能包含*-->
        <module name="OneTopLevelClass"/>
        <module name="NoLineWrap"/>
        <module name="EmptyBlock">
            <property name="option" value="TEXT"/>
            <property name="tokens"
                      value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH,LITERAL_WHILE,LITERAL_FOR,LITERAL_CASE"/>
        </module>
        <module name="NeedBraces"/>
        <!--option: 定义左大括号'{'显示位置,eol在同一行显示,nl在下一行显示
         maxLineLength: 大括号'{'所在行行最多容纳的字符数
         tokens: 该属性适用的类型,例:CLASS_DEF,INTERFACE_DEF,METHOD_DEF,CTOR_DEF -->
        <module name="LeftCurly">
            <property name="maxLineLength" value="100"/>
        </module>

        <module name="RightCurly"/>
        <module name="RightCurly">
            <property name="option" value="alone"/>
            <property name="tokens"
                      value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
        </module>
        <!--检查空格 方法体前括号,比较操作符两边空格等-->
        <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. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
            <message key="ws.notPreceded"
                     value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
        </module>
        <module name="OneStatementPerLine"/>
        <!--一行声明一个变量-->
        <module name="MultipleVariableDeclarations"/>
        <module name="ArrayTypeStyle"/>
        <!--default clause-->
        <module name="MissingSwitchDefault"/>
        <!--case break-->
        <module name="FallThrough"/>
        <!--Long型常量后缀-->
        <module name="UpperEll"/>
        <module name="ModifierOrder"/>
        <!--空行规则-->
        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
        </module>
        <module name="SeparatorWrap">
            <property name="tokens" value="DOT"/>
            <property name="option" value="nl"/>
        </module>
        <module name="SeparatorWrap">
            <property name="tokens" value="COMMA"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
            <message key="name.invalidPattern"
                     value="Package name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="TypeName">
            <message key="name.invalidPattern"
                     value="Type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--成员变量命名规则--><!--修改-->
        <module name="MemberName">
            <property name="format" value="^m[A-Z][a-zA-Z0-9]*$"/>
            <message key="name.invalidPattern"
                     value="Member name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--参数命名规则--><!--修改-->
        <module name="ParameterName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
            <message key="name.invalidPattern"
                     value="Parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--unused start-->
        <!--<module name="CatchParameterName">-->
        <!--<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>-->
        <!--<message key="name.invalidPattern"-->
        <!--value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>-->
        <!--</module>-->
        <!--unused end-->
        <module name="LocalVariableName">
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
            <property name="allowOneCharVarInForLoop" value="true"/>
            <message key="name.invalidPattern"
                     value="Local variable name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ClassTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Class type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Method type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="InterfaceTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Interface type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--不能定义finalize方法-->
        <module name="NoFinalizer"/>
        <!--泛型表示中的空格规则-->
        <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>
        <!--缩进规则-->
        <module name="Indentation">
            <property name="basicOffset" value="4"/>
            <property name="braceAdjustment" value="0"/>
            <property name="caseIndent" value="4"/>
            <property name="throwsIndent" value="4"/>
            <property name="arrayInitIndent" value="4"/>
            <property name="lineWrappingIndentation" value="4"/>
        </module>
        <!--名称中缩写,驼峰规则-->
        <module name="AbbreviationAsWordInName">
            <property name="ignoreFinal" value="false"/>
            <property name="allowedAbbreviationLength" value="1"/>
        </module>
        <!--重载方法不能被其他方法间隔开-->
        <module name="OverloadMethodsDeclarationOrder"/>
        <!--局部变量声明与使用的间隔,默认3行-->
        <module name="VariableDeclarationUsageDistance"/>
        <!--import规则与android studio IDE 不一致,采用IDE规则-->
        <!--<module name="CustomImportOrder">-->
            <!--<property name="specialImportsRegExp" value="com.google"/>-->
            <!--<property name="sortImportsInGroupAlphabetically" value="true"/>-->
            <!--<property name="customImportOrderRules"-->
                      <!--value="STATIC###SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE"/>-->
        <!--</module>-->
        <module name="MethodParamPad"/>
        <module name="OperatorWrap">
            <property name="option" value="NL"/>
            <property name="tokens"
                      value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
        </module>
        <module name="AnnotationLocation">
            <property name="tokens"
                      value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
        </module>
        <module name="AnnotationLocation">
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="allowSamelineMultipleAnnotations" value="true"/>
        </module>
        <!--@注释 @param, @return, @throws, @deprecated -->
        <module name="NonEmptyAtclauseDescription"/>
        <module name="JavadocTagContinuationIndentation"/>
        <!--unused start-->
        <!--注释文档规则,@return 不能包含的文字,第一句注释结尾标点-->
        <!--<module name="SummaryJavadoc">-->
            <!--<property name="forbiddenSummaryFragments"-->
                      <!--value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>-->
        <!--</module>-->
        <!--unused end-->
        <module name="JavadocParagraph"/>
        <module name="AtclauseOrder">
            <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
            <property name="target"
                      value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
        </module>
        <!--方法注释 修改 可以不添加方法注释-->
        <module name="JavadocMethod">
            <property name="scope" value="public"/>
            <property name="allowMissingParamTags" value="true"/>
            <property name="allowMissingThrowsTags" value="true"/>
            <property name="allowMissingReturnTag" value="true"/>
            <property name="minLineCount" value="2"/>
            <property name="allowedAnnotations" value="Override, Test"/>
            <property name="allowThrowsTagsForSubclasses" value="true"/>
            <property name="allowMissingJavadoc"  value="true"  />
        </module>
        <module name="MethodName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
            <message key="name.invalidPattern"
                     value="Method name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!--these unused start-->
        <!--<module name="SingleLineJavadoc">-->
        <!--<property name="ignoreInlineTags" value="false"/>-->
        <!--</module>-->
        <!--<module name="EmptyCatchBlock">-->
        <!--<property name="exceptionVariableName" value="expected"/>-->
        <!--</module>-->
        <!--<module name="CommentsIndentation"/>-->
        <!--these unused end-->
        <!--嵌套深度-->
        <module name="NestedForDepth"/>
        <module name="NestedTryDepth"/>
        <module name="NestedIfDepth">
            <property name="max" value="3"/>
        </module>
        <!--<module name="MethodLength">-->
            <!--<property name="max" value="20"/>-->
            <!--<property name="countEmpty"  value="false"/>-->
        <!--</module>-->
        <module name="SimplifyBooleanExpression"/>
        <module name="StaticVariableName" >
            <property name="format" value="^s[A-Z][a-zA-Z0-9]*$"/>
        </module>
        <!--<module name="TodoComment"/>-->
    </module>
</module>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值