android studio 使用checkstyle全攻略

首先你需要了解什么是代码规范,为什么需要这样

当你看完这篇文章,咱们接下来就该学习怎么配置checkstyle

步骤:

1.https://github.com/android/platform_development/blob/master/ide/intellij/codestyles/AndroidStyle.xml

2.将AndroidStyle.xml复制到~/.AndroidStudio/config/codestyles/(C:\Users\Administrator.AndroidStudio1.5\config\codestyles)

如果没有codestyles就创建一个

3.在Settings(or Preferences in Mac OS X) > Code Style > Java, 选择AndroidStyle,同时CodeStyle > XML , 选择AndroidStyle.

4.重启androidstudio, 执行Analyze(菜单)–> InspectCode.

5.在这个时候你如果不小心在codestyles中加入了错误的的文件,androidstudio重启的时候会报错,这时删除~/.AndroidStudio/system/caches/(C:\Users\Administrator.AndroidStudio1.5\system\caches)中的所有文件,重启即可,附:这个问题折磨了我一天

6.接下来这篇博客会介绍如何使用checkstyle

更多参考文档:

http://www.thinksaas.cn/group/topic/349857/

http://www.cnblogs.com/liugang/archive/2010/10/26/1860903.html

http://www.cnblogs.com/qianxudetianxia/archive/2012/01/01/2309102.html

gradle 配置checkStyle:

http://blog.csdn.net/forlong401/article/details/42077013

http://gradle.org/docs/current/dsl/org.gradle.api.plugins.quality.Checkstyle.html

下面附送一个中英对照

<?xml version="1.0" encoding="GBK"?>
  <!DOCTYPE module PUBLIC  "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
      "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
  <!--
    Checkstyle configuration that checks the sun coding conventions from:
      - the Java Language Specification at
        http://java.sun.com/docs/books/jls/second_edition/html/index.html
      - the Sun Code Conventions at http://java.sun.com/docs/codeconv/
      - the Javadoc guidelines at
        http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
      - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
      - some best practices
    Checkstyle is very configurable. Be sure to read the documentation at
    http://checkstyle.sf.net (or in your downloaded distribution).
    Most Checks are configurable, be sure to consult the documentation.
    To completely disable a check, just comment it out or delete it from the file.
    Finally, it is worth reading the documentation.
  -->
  <module name="Checker">
      <property name="severity" value="warning"/>  

      <!--
          If you set the basedir property below, then all reported file
          names will be relative to the specified directory. See
          http://checkstyle.sourceforge.net/5.x/config.html#Checker
          <property name="basedir" value="${basedir}"/>
      -->
      <!-- Checks that a package-info.java file exists for each package.     -->
      <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocPackage -->
      <module name="JavadocPackage"/>
      <!-- Checks whether files end with a new line.                        -->
      <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile
  -->
      <!-- 检查文件是否以一个新行结束-->
      <module name="NewlineAtEndOfFile"/>
      <!-- Checks that property files contain the same keys.         -->
      <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
      <!-- 检查**.properties配置文件 是否有没有设值的key-->
      <module name="Translation"/>  

      <!-- Checks for Size Violations.                    -->
      <!-- See http://checkstyle.sf.net/config_sizes.html -->
      <!-- 检查文件的长度 default max=2000 -->
      <module name="FileLength"/>  

      <!-- Checks for whitespace                               -->
      <!-- See http://checkstyle.sf.net/config_whitespace.html -->
      <!-- 检查文件中是否含有‘\t‘-->
      <module name="FileTabCharacter"/>
      <!-- Miscellaneous other checks.                   -->
      <!-- See http://checkstyle.sf.net/config_misc.html -->
      <!-- 不知道作用 -->
      <module name="RegexpSingleline">
         <property name="format" value="\s+$"/>
         <property name="minimum" value="0"/>
         <property name="maximum" value="0"/>
         <property name="message" value="Line has trailing spaces."/>
      </module>
      <module name="TreeWalker">
          <!-- Checks for Javadoc comments.                     -->
          <!-- See http://checkstyle.sf.net/config_javadoc.html -->
          <!-- Checks the Javadoc of a method or constructor. By default, does not check for unused throws. To allow documented java.lang.RuntimeExceptions that are not declared, set property allowUndeclaredRTE to true. The scope to verify is specified using the Scope class and defaults to Scope.PRIVATE. To verify another scope, set property scope to a different scope. -->
          <module name="JavadocMethod">
              <property name="logLoadErrors" value="true"/>
              <property name="suppressLoadErrors" value="true"/>
          </module>
          <!-- Checks Javadoc comments for class and interface definitions. By default, does not check for author or version tags. The scope to verify is specified using the Scope  class and defaults to Scope.PRIVATE. To verify another scope, set property scope to one of the Scope constants. To define the format for an author tag or a version tag, set property authorFormat or versionFormat respectively to a  regular expression.-->
          <module name="JavadocType"/>
          <!-- Checks that variables have Javadoc comments. -->
          <module name="JavadocVariable"/>
          <!--  Validates Javadoc comments to help ensure they are well formed. The following checks are performed:
                  * Ensures the first sentence ends with proper punctuation (That is a period, question mark, or exclamation mark, by default). Javadoc automatically places the first sentence in the method summary table and index. With out proper punctuation the Javadoc may be malformed. All items eligible for the {@inheritDoc} tag are exempt from this requirement.
                  * Check text for Javadoc statements that do not have any description. This includes both completely empty Javadoc, and Javadoc with only tags such as @param and @return.
                  * Check text for incomplete HTML tags. Verifies that HTML tags have corresponding end tags and issues an "Unclosed HTML tag found:" error if not. An "Extra HTML tag found:" error is issued if an end tag is found without a previous open tag.
                  * Check that a package Javadoc comment is well-formed (as described above) and NOT missing from any package-info.java files.
                  * Check for allowed HTML tags. The list of allowed HTML tags is "a", "abbr", "acronym", "address", "area", "b", "bdo", "big", "blockquote", "br", "caption", "cite", "code", "colgroup", "del", "div", "dfn", "dl", "em", "fieldset", "h1" to "h6", "hr", "i", "img", "ins", "kbd", "li", "ol", "p", "pre", "q", "samp", "small", "span", "strong", "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thread", "tr", "tt", "ul".
              These checks were patterned after the checks made by the DocCheck doclet available from Sun. -->
          <!--<module name="JavadocStyle"/>-->  

          <!-- Checks for Naming Conventions.                  -->
          <!-- See http://checkstyle.sf.net/config_naming.html -->
          <!-- Each of these naming modules validates identifiers for particular code elements. Valid identifiers for a naming module are specified by its  format property. The value of format is a  regular expression for valid identifiers. -->
          <!-- constants (static,  final fields) -->
          <module name="ConstantName"/>
          <!-- local, final variables, including catch parameters -->
          <module name="LocalFinalVariableName"/>
          <!-- local, non-final variables, including catch parameters-->
          <module name="LocalVariableName"/>
          <!-- non-static fields -->
          <module name="MemberName"/>
          <!-- methods -->
          <module name="MethodName"/>
          <!-- packages -->
          <module name="PackageName"/>
          <!-- parameters -->
          <module name="ParameterName"/>
          <!-- static, non-final fields -->
          <module name="StaticVariableName"/>
      <!-- classes and interfaces -->
      <module name="TypeName"/>  

      <!-- Checks for Headers                                -->
      <!-- See http://checkstyle.sf.net/config_header.html   -->
      <!-- <module name="Header">                            -->
          <!-- The follow property value demonstrates the ability     -->
          <!-- to have access to ANT properties. In this case it uses -->
          <!-- the ${basedir} property to allow Checkstyle to be run  -->
          <!-- from any directory within a project. See property      -->
          <!-- expansion,                                             -->
              <!-- http://checkstyle.sf.net/config.html#properties        -->
              <!-- <property                                              -->
              <!--     name="headerFile"                                  -->
              <!--     value="${basedir}/java.header"/>                   -->
          <!-- </module> -->
          <!-- Following interprets the header file as regular expressions. -->
          <!-- <module name="RegexpHeader"/>                                -->  

          <!-- Checks for imports                              -->
          <!-- See http://checkstyle.sf.net/config_import.html -->
          <!-- 必须导入类的完整路径,即不能使用*导入所需的类 -->
          <module name="AvoidStarImport"/>
          <!-- 检查是否从非法的包中导入了类 illegalPkgs: 定义非法的包名称-->
          <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
          <!-- 检查是否导入了不必显示导入的类-->
          <module name="RedundantImport"/>
          <!-- 检查是否导入的包没有使用-->
          <module name="UnusedImports"/>  

          <!-- Checks for Size Violations.                    -->
          <!-- See http://checkstyle.sf.net/config_sizes.html -->
          <!-- Checks for long methods and constructors. max default 150. max=80设置长度80 -->
          <module name="MethodLength"/>
          <!-- Checks the number of parameters of a method or constructor. max default 7. -->
          <module name="ParameterNumber"/>
          <!-- Checks for long lines.
                  Rationale: Long lines are hard to read in printouts or if developers have limited screen space for the source code, e.g. if the IDE displays additional information like project tree, class hierarchy, etc. -->
          <module name="LineLength"/>
          <!-- Checks for whitespace                               -->
          <!-- See http://checkstyle.sf.net/config_whitespace.html -->
          <!-- 检查for iterator语句是否使用空格
                  option: 定义初始化语句是否使用空格,例如:space表示使用空格,则for(Iterator iterator = List.iterator(); iterator.hasNext(); iterator.next())就是形式合理的,否则就是形式不合理的-->
         <module name="EmptyForIteratorPad"/>
         <!-- 检查方法参数的格式
         allowLineBreaks: 参数是否允许在不同行(注:没有作用)
         option: 在参数和括号、参数和标识符之间是否包含空格-->
         <module name="MethodParamPad"/>
         <!-- Checks that there is no whitespace after a token. More specifically, it checks that it is not followed by whitespace, or (if linebreaks are allowed) all characters on the line after are whitespace. To forbid linebreaks after a token, set property allowLineBreaks to  false. -->
          <module name="NoWhitespaceAfter"/>
          <!-- Checks that there is no whitespace before a token. More specifically, it checks that it is not preceded with whitespace, or (if linebreaks are allowed) all characters on the line before are whitespace. To allow linebreaks before a token, set property allowLineBreaks to  true. -->
          <module name="NoWhitespaceBefore"/>
          <!-- 检查运算符是否在应在同一行
                  option: 定义运算符的位置,eol在同一行,nl在下一行
                  tokens: 定义检查的类型-->
          <module name="OperatorWrap"/>
          <!-- 检查左小括号‘(‘后边和右小括号‘)‘前边是否有空格
                  option: space表示有空格,nospace表示没有空格
                  tokens: 定义检查的类型-->
          <module name="ParenPad"/>
          <!-- Checks the policy on the padding of parentheses for typecasts. That is, whether a space is required after a left parenthesis and before a right parenthesis, or such spaces are forbidden. -->
          <module name="TypecastParenPad"/>
          <!-- 检查类型后是否包含空格 Checks that a token is followed by whitespace.
                  tokens: 检查的类型 -->
          <module name="WhitespaceAfter"/>
          <!-- Checks that a token is surrounded by whitespace. Empty constructor and method bodies (blocks) of the form
                 public MyClass() {}      // empty constructor
                 public void func() {}    // empty method
                 may optionally be exempted from the policy using the allowEmptyMethods and allowEmptyConstructors properties.
         allowEmptyConstructors default value is false
         allowEmptyMethods default value is false
         -->
         <module name="WhitespaceAround"/>  

         <!-- Modifier Checks                                    -->
         <!-- See http://checkstyle.sf.net/config_modifiers.html -->
         <!-- ModifierOrder 检查修饰符的顺序,默认是 public,protected,private,abstract,static,final,transient,volatile,synchronized,native,strictfp-->
         <module name="ModifierOrder"/>
         <!-- 检查是否有多余的修饰符,例如:接口中的方法不必使用public、abstract修饰
                  tokens: 检查的类型 -->
         <module name="RedundantModifier"/>  

         <!-- Checks for blocks. You know, those {}‘s         -->
         <!-- See http://checkstyle.sf.net/config_blocks.html -->
         <!-- 检查是否有嵌套的代码块
               allowInSwitchCase: 定义是否允许switch case中使用嵌套的代码块 -->
         <module name="AvoidNestedBlocks"/>
         <!-- 检查是否有空代码块
                 option: 定义代码块中应该包含的内容,例如:stmt表示语句
                 tokens: 检查的类型-->
         <module name="EmptyBlock"/>
         <!--option: 定义左大括号‘{‘显示位置,eol在同一行显示,nl在下一行显示
                 maxLineLength: 大括号‘{‘所在行行最多容纳的字符数
                 tokens: 该属性适用的类型,例:CLASS_DEF,INTERFACE_DEF,METHOD_DEF,CTOR_DEF -->
         <module name="LeftCurly"/>
          <!-- NeedBraces 检查是否应该使用括号的地方没有加括号
               tokens: 定义检查的类型 -->
          <module name="NeedBraces"/>
          <!-- Checks the placement of right curly braces (‘}‘) for  else, try, and catch tokens. The policy to verify is specified using property  option.
                  option: 右大括号是否单独一行显示
                  tokens: 定义检查的类型  -->
          <module name="RightCurly"/>  

          <!-- Checks for common coding problems               -->
          <!-- See http://checkstyle.sf.net/config_coding.html -->
          <!-- 检查是否在同一行初始化, 例如:private int Age = nGe==1 ? 100 : 0; 就应该避免
               Detects inline conditionals. An example inline conditional is this:
                  String a = getParameter("a");
                  String b = (a==null || a.length<1) ? null : a.substring(1);
                  Rationale: Some developers find inline conditionals hard to read, so their company‘s coding standards forbids them. -->
          <module name="AvoidInlineConditionals"/>
          <!--  The "double-checked locking" idiom (DCL) tries to avoid the runtime cost of synchronization. An example that uses the DCL idiom is this:
                  public class MySingleton
                  {
                      private static theInstance = null;
                      private MySingleton() {}
                      public MySingleton getInstance() {
                          if ( theInstance == null ) { // synchronize only if necessary
                              synchronized( MySingleton.class ) {
                                  if ( theInstance == null ) {
                                      theInstance = new MySingleton();
                                  }
                              }
                          }
                      }
                  }
                  The problem with the DCL idiom in Java is that it just does not work correctly. Using it introduces bugs that are extremely hard to track down and reproduce. The "Double-Checked Locking is Broken" Declaration has an in depth explanation of the exact problem which has to do with the semantics of the Java memory model.
                  The DoubleCheckedLocking check will find source code where a test is wrapped in a synchronized block that is wrapped in the same test, like in the example above. -->
          <module name="DoubleCheckedLocking"/>    <!-- MY FAVOURITE -->
          <!--Detects empty statements (standalone ;). -->
          <module name="EmptyStatement"/>
          <!-- 检查在重写了equals方法后是否重写了hashCode方法 -->
          <module name="EqualsHashCode"/>
          <!-- Checks that a local variable or a parameter does not shadow a field that is defined in the same class.-->
          <module name="HiddenField"/>
          <!--  Checks for illegal instantiations where a factory method is preferred.
                  Rationale: Depending on the project, for some classes it might be preferable to create instances through factory methods rather than calling the constructor.
                  A simple example is the java.lang.Boolean class. In order to save memory and CPU cycles, it is preferable to use the predefined constants TRUE and FALSE. Constructor invocations should be replaced by calls to Boolean.valueOf().
                  Some extremely performance sensitive projects may require the use of factory methods for other classes as well, to enforce the usage of number caches or object pools. -->
          <module name="IllegalInstantiation">
              <property name="classes" value="java.lang.Boolean"/>
          </module>
          <!--  Checks for assignments in subexpressions, such as in String s = Integer.toString(i = 2);.
                  Rationale: With the exception of for iterators, all assignments should occur in their own toplevel statement to increase readability. With inner assignments like the above it is difficult to see all places where a variable is set. -->
          <module name="InnerAssignment"/>
          <!-- Checks that there are no "magic numbers", where a magic number is a numeric literal that is not defined as a constant. By default, -1, 0, 1, and 2 are not considered to be magic numbers. -->
          <module name="MagicNumber"/>
          <!--  Checks that switch statement has "default" clause. 检查switch语句是否有‘default’从句
                  Rationale: It‘s usually a good idea to introduce a default case in every switch statement. Even if the developer is sure that all currently possible cases are covered, this should be expressed in the default branch, e.g. by using an assertion. This way the code is protected aginst later changes, e.g. introduction of new types in an enumeration type. -->
          <module name="MissingSwitchDefault"/>
          <!-- Checks for redundant exceptions declared in throws clause such as duplicates, unchecked exceptions or subclasses of another declared exception. 检查是否抛出了多余的异常 -->
          <module name="RedundantThrows">
              <property name="logLoadErrors" value="true"/>
              <property name="suppressLoadErrors" value="true"/>
          </module>
          <!--  Checks for overly complicated boolean expressions. Currently finds code like  if (b == true), b || true, !false, etc.
                  检查boolean值是否冗余的地方
                  Rationale: Complex boolean logic makes code hard to understand and maintain. -->
          <module name="SimplifyBooleanExpression"/>
          <!--  Checks for overly complicated boolean return statements. For example the following code
                  检查是否存在过度复杂的boolean返回值
                  if (valid())
                      return false;
                  else
                      return true;
                  could be written as
                  return !valid();
                  The Idea for this Check has been shamelessly stolen from the equivalent PMD rule. -->
          <module name="SimplifyBooleanReturn"/>
          <!-- Checks for class design                         -->
          <!-- See http://checkstyle.sf.net/config_design.html -->
          <!--  Checks that classes are designed for extension. More specifically, it enforces a programming style where superclasses provide empty "hooks" that can be implemented by subclasses.
              检查子类是否非法破坏了父类或接口的限制条件
              The exact rule is that nonprivate, nonstatic methods of classes that can be subclassed must either be
                  * abstract or
                  * final or
                  * have an empty implementation
              Rationale: This API design style protects superclasses against beeing broken by subclasses. The downside is that subclasses are limited in their flexibility, in particular they cannot prevent execution of code in the superclass, but that also means that subclasses cannot corrupt the state of the superclass by forgetting to call the super method. -->
          <module name="DesignForExtension"/>
          <!-- Checks that a class which has only private constructors is declared as final.只有私有构造器的类必须声明为final-->
          <module name="FinalClass"/>
          <!--  Make sure that utility classes (classes that contain only static methods or fields in their API) do not have a public constructor.
              确保Utils类(只提供static方法和属性的类)没有public构造器。
              Rationale: Instantiating utility classes does not make sense. Hence the constructors should either be private or (if you want to allow subclassing) protected. A common mistake is forgetting to hide the default constructor.
              If you make the constructor protected you may want to consider the following constructor implementation technique to disallow instantiating subclasses:
              public class StringUtils // not final to allow subclassing
              {
                  protected StringUtils() {
                      throw new UnsupportedOperationException(); // prevents calls from subclass
                  }
                  public static int count(char c, String s) {
                      // ...
                 }
             }-->
         <module name="HideUtilityClassConstructor"/>
         <!--  Implements Bloch, Effective Java, Item 17 - Use Interfaces only to define types.
             不允许interface像java.ioSerializable一样只作为标记,不包含任何methods和constants。
             According to Bloch, an interface should describe a type. It is therefore inappropriate to define an interface that does not contain any methods but only constants. The Standard class javax.swing.SwingConstants is an example of a class that would be flagged by this check.
             The check can be configured to also disallow marker interfaces like java.io.Serializable, that do not contain methods or constants at all. -->
         <module name="InterfaceIsType"/>
         <!--  Checks visibility of class members. Only static final members may be public; other class members must be private unless property protectedAllowed or packageAllowed is set.
             检查class成员属性可见性。只有static final 修饰的成员是可以public的。其他的成员属性必需是private的,除非属性protectedAllowed或者packageAllowed设置了true.
             Public members are not flagged if the name matches the public member regular expression (contains "^serialVersionUID$" by default). Note: Checkstyle 2 used to include "^f[A-Z][a-zA-Z0-9]*$" in the default pattern to allow CMP for EJB 1.1 with the default settings. With EJB 2.0 it is not longer necessary to have public access for persistent fields, hence the default has been changed.
             Rationale: Enforce encapsulation. 强制封装 -->
         <module name="VisibilityModifier"/>  

         <!-- Miscellaneous other checks.                   -->
         <!-- See http://checkstyle.sf.net/config_misc.html -->
         <!-- Checks the style of array type definitions. Some like Java-style: public static void main(String[] args) and some like C-style: public static void main(String args[])
             检查再定义数组时,采用java风格还是c风格,例如:int[] num是java风格,int num[]是c风格。默认是java风格-->
         <module name="ArrayTypeStyle"/>
         <!--  Check that method/constructor/catch block parameters are final. Interface and abstract methods are not checked - the final keyword does not make sense for interface and abstract method parameters as there is no code that could modify the parameter.
             检查method/constructor/catch块中的参数是否是final修饰的。
             Rationale: Changing the value of parameters during the execution of the method‘s algorithm can be confusing and should be avoided. A great way to let the Java compiler prevent this coding style is to declare parameters final. -->
         <!-- <module name="FinalParameters"/> -->
         <!-- A check for TODO: comments. Actually it is a generic regular expression matcher on Java comments. To check for other patterns in Java comments, set property format.
             检查是否存在TODO(待处理) TODO是javaIDE自动生成的。一般代码写完后要去掉。
         -->
         <module name="TodoComment"/>
         <!--  Checks that long constants are defined with an upper ell. That is ‘ L‘ and not ‘l‘. This is in accordance to the Java Language Specification,  Section 3.10.1.
             检查是否在long类型是否定义了大写的L.字母小写l和数字1(一)很相似。
             looks a lot like 1. -->
         <module name="UpperEll"/>
     </module>
 </module>
时间: 2024-08-01 19:01:52

android studio 使用checkstyle全攻略的相关文章

android屏幕适配的全攻略

一. 核心概念与单位详解 1. 什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 屏幕分辨率越大,手机越清晰 2. 什么是dp.dip.dpi.sp.px?之间的关系是什么? dip:Density Independent Pixels(密度无关像素)的缩写.以160dpi为基准,1dp=1pxdp:同dipdpi:屏幕像素密度的单位,"dot per inch"的缩写 px:像素,物理上的绝对单位 sp:Scale-Independent Pixels的缩写,可以根据文字大小首选项自动进行

安卓ADT项目及升级AS(Android Studio)全攻略

安卓ADT项目及升级AS全攻略...1 1    ADT项目(即原Eclipse开发环境下项目)打包.签名.混淆配置...2 1.1     生成签名文件...2 1.2     打包配置...2 2    Eclipse项目升级至AS项目及升级过程遇到问题...7 2.1     首先将原先项目复制一份出来(避免损坏原项目),记为project_tag..7 2.2     打开AS选择Import project (Eclipse ADT,Gradle,etc)7 3    AS项目多渠道混

fiddler Android下https抓包全攻略

fiddler Android下https抓包全攻略 fiddler的http.https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行.支付宝.陌陌这样的APP是抓不到包的,需要一些特殊的配置,本文把fiddler Android下https抓包的详细配置都罗列出来,供大家参考. 一.普通https抓包设置 先对Fiddler进行设置: 勾选“CaptureHTTPS CONNECTs”,接着勾选“Decrypt HTTPS traffic”.同时,由于我

Android屏幕适配全攻略(最权威的官方适配指导)

Android屏幕适配全攻略(最权威的官方适配指导)

前台页面优化全攻略(三)

经过前两篇文章的实践,你的网站加载速度一定有了非常明显的变化.能把实践跟到这篇文章的人想必一定是极客中的极客.如果你仍对网站的加载速度不满意,可以看看再尝试一下本文中几近疯狂的终极优化方案. 你可以对网站进行快速的优化,但网站日常的节食却很难.也许你已经花了很大的力气去优化你的CSS和JavaScript代码,但是你所做的努力马上又会因为老板或客户期望的新功能而付之东流.所以看来不论是人还是网页,减肥都贵在坚持. 这篇终极减肥方案可能不适合所有的网站,但是我相信它可以引起你对网页大小的重视. 1

Gradle脚本基础全攻略

[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 在开始Gradle之前请务必保证自己已经初步了解了Groovy脚本,特别是闭包规则,如果还不了解Groovy则可以先看<Groovy脚本基础全攻略>这一篇博客速成一下Groovy基础,然后再看此文即可.关于Gradle速成干货基础详情也请参考Geadle官方网站,不好意思我太Low了. Gradle核心是基于Groovy的领域特定语言(DSL,具体概念参见<

战斗bug技巧全攻略

程序员不是有一幅这样的对联吗 上联:一个项目两部电脑三餐盒饭只为四千工资搞得五脏俱损六神无主仍然七点起床八点开会处理九个漏洞十分辛苦: 下联:十年编码九年加班八面无光忙的七窍生烟到头六亲不认五体投地依旧四肢酸软三更加班只为二个臭钱一生孤苦: 横批:苦逼程序员. 其实,程序员职业生涯总结起来就这三件事情Ⅰ理解需求 Ⅱ编码 Ⅲ改bug. 可见,bug是程序员的天敌.bug对于我们自己名誉和产品自身质量影响是不言而喻的.哪么,怎么能够降低bug了. 卡耐基说过,人性的弱点要克服.程序员必须克服一些自身

3D计算机图形学零起点全攻略(转)

3D计算机图形学零起点全攻略 这篇文章不包含任何技术知识,但我的希望它能指明一条从零开始通往3D领域的成功之路.我将罗列我看过的相关经典书籍作为学习文献,阅读规则是每进入下个内容,我都会假设已经完成前面全部的文献研习内容.相信若能按照这条路走到最后,会有所进益. 完成整部分内容需要具备基础: 英语:CET4以上 数学:精通数字加减乘除法. 物理:基本力学. 计算机:了解电脑的基本知识,熟练使用Windows. 电脑配置: CPU:双核1.5以上 显卡:NVIDIA GeForce8400G MS

在电脑上测试手机网站全攻略

最近公司要开发网站的移动版,让我准备准备知识,话说本人开发移动网站的经验还真不多,最悲剧的事情就是我的手机是个经典的诺基亚,而且公司还不给配手机,这是有多扣啊,没办烦啦,没有手机就用电脑模拟呗,相办法代替,查了很多资料,尝试了大部分方法,下面将这一天的努力总结下分享给大家,也让大家免去看那么多文章,以下介绍的方法,都是本人亲自测试成功的方法. Chrome* chrome模拟手机总共有四种方法,原理都一样,通过伪装User-Agent,将浏览器模拟成Android设备.以下标星的为推荐方法. 1