代码规范与质量

保证项目代码的和谐一致 CheckStyle 和 Alibaba Java Coding Guidelines

一般代码编写规范包含代码结构,格式,命名、javadoc还有编码的最佳实践等内容

CheckStyle是一个帮助程序员来遵守一直的编码规范的工具。默认,它支持google 和sun 的java style guide。而且它是高度可配置的,允许自定义编码规范,并可以对各种IDE(eclipse、Intellij)和构建工具(maven,gradle)的支持。使用CheckStyle可根据团队的需求对编码规范进行自定义,在团队中推广使用,让代码看起来更整洁、漂亮

Alibaba Java Coding Guidelines 可能会更适合我们,它是基于《阿里巴巴Java开发规约》的,将不符合规约的代码按Blocker/Critical/Major三个等级显示在下方。相比CheckStyle它提供中文提示功能,基于Inspection机制提供了实时检测功能,部分规则实现了批量一键修复的功能。

代码扫描分析工具 FindBugs Lint PMD

这几种工具的功能有所重叠,可以根据需求选用一种或几种,并不需要全部使用。

FindBugs和PMD极其类似,但PMD是基于源码的,而FindBugs检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。PMD能发现一个FindBugs发现不了的问题,反之亦然。

FindBugs,可集成到Jenkins上,每次编译都进行检查提供给开发者作为一个改进的参考;也可使用AS的插件。可配置检查规则。
FindBugs的静态分析包括:

  • 60余种 Bad practice 坏的实践,下面列举几个:
    HE:类中equals()与hashCode()没有同时定义,或者使用了错误的对象的hashCode()或equals()。
    SQL:Statement 的execute方法调用了非常量的字符串;或Prepared Statement是由一个非常量的字符串产生。
    DE: 方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。

  • 80余种 Correctness 一般的正确性问题,可能导致错误的代码,下面列举几个:
    NP: 空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。
    Nm: 类定义了hashcode()方法,但实际上并未覆盖父类Object的hashCode();类定义了tostring()方法,但实际上并未覆盖父类Object的toString();很明显的方法和构造器混淆;方法名容易混淆。
    SQL:方法尝试访问一个Prepared Statement的0索引;方法尝试访问一个ResultSet的0索引。
    UwF:所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。

  • 1种 Internationalization 国际化,当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。

  • 12种 Malicious code vulnerability 可能受到的恶意攻击,如果代码公开,可能受到恶意攻击的代码,下面列举几个:
    FI: 一个类的finalize()应该是protected,而不是public的。
    MS:属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。

  • 27种 Multithreaded correctness 多线程的正确性,多线程编程时,可能导致错误的代码,下面列举几个:
    ESync:空的同步块,很难被正确使用。
    MWN:错误使用notify(),可能导致IllegalMonitorStateException异常;或错误的使用wait()。
    No: 使用notify()而不是notifyAll(),只是唤醒一个线程而不是所有等待的线程。
    SC: 构造器调用了Thread.start(),当该类被继承可能会导致错误。

  • 23种 Performance 性能问题,可能导致性能不佳的代码,下面列举几个:
    DM:方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似Integer.toString(1) 代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。
    SIC:如果一个内部类想在更广泛的地方被引用,它应该声明为static。
    SS: 如果一个实例属性不被读取,考虑声明为static。
    UrF:如果一个属性从没有被read,考虑从类中去掉。
    UuF:如果一个属性从没有被使用,考虑从类中去掉。

  • 43种 Dodgy 危险的,具有潜在危险的代码,可能运行期产生错误,下面列举几个:
    CI: 类声明为final但声明了protected的属性。
    DLS:对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。
    ICAST: 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。
    INT:没必要的整型数字比较,如X <= Integer.MAX_VALUE。
    NP: 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。
    REC:直接捕获Exception,而实际上可能是RuntimeException。
    ST: 从实例方法里直接修改类变量,即static属性。

PMD可集成到Jenkins上
检查范围:

  • 潜在的bug:空的try/catch/finally/switch语句
  • 未使用的代码:未使用的局部变量、参数、私有方法等
  • 可选的代码:String/StringBuffer的滥用
  • 复杂的表达式:不必须的if语句、可以使用while循环完成的for循环
  • 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
  • 循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象
  • 资源关闭:Connect,Result,Statement等使用之后确保关闭掉

Lint 本地手动检查、编码实时检查、编译时检查、commit检查,以及在CI系统中提Pull Request时检查、打包发版时检查等

错误类型: Fatal 【严重错误】 > Error【错误】 > Warning 【提示】 > Information 【信息】 > Ignore【可忽略】

检查的问题:
- Correctness 不够完美的编码,比如硬编码、使用过时 API 等
- Performanc 对性能有影响的编码,比如:静态引用,循环引用等
- Internationalization 国际化,直接使用汉字,没有使用资源引用等
- Security 不安全的编码,比如在 WebView 中允许使用 JavaScriptInterface 等
- Usability 可用的,有更好的替换的 比如排版、图标格式建议.png格式 等
- Accessibility 辅助选项,比如ImageView的contentDescription往往建议在属性中定义 等

具体常见问题:

  • Correctness

    • DuplicatedIds Layout中id应该唯一
    • NewApi 代码中使用的某些API高于Manifest中的Min SDK
    • InconsistentArrays 字符串国际化中,同一名字的的String-Array对应的item值不相同
    • Registered Activity/Service/ContentProvider没有通过AndroidManifest注册
    • Deprecated 使用已经废弃的API
    • PxUsage 避免使用px,使用dp
  • Correctness:Messeges

    • MissingTranslation 字符串国际化不完全
    • ExtraTranslation 国际化的字符串,在默认位置(defaultlocale),没有定义
  • Security
    • SetJavaScriptEnabled 不确定你的程序中确实需要JavaScript就不要执行SetJavaScriptEnabled。
    • ExportedContentProvider/ExportedReceiver/ExportedService/ExportedActivity ContentProvider/Receiver/Service/Activity的exported为true时,设置一个Permission,让使用者获取了Permission才能使用。
    • HardcodedDebugMode 不要在manifest中设置android:debuggable。
      设置它,编译的任何版本都要采用指定的debug模式。不设置,编译Eng版本采用debug模式;编译User版本采用release模式。
  • Performance
    • DrawAllocation 避免在绘制或者解析布局(draw/layout)时分配对象。E.g.,Ondraw()中实例化Paint对象。
    • ObsoleteLayoutParam Layout中无用的参数。
    • UseCompoundDrawables 可优化的布局:如包含一个Imageview和一个TextView的线性布局,可被采用CompoundDrawable的TextView代替。
    • UseSparseArrays 尽量用Android的SparseArray代替Hashmap
    • DisableBaselineAlignment 如果LinearLayout被用于嵌套的layout空间计算,它的android:baselineAligned属性应该设置成false,以加速layout计算。
    • FloatMath 使用FloatMath代替Math。
    • NestedWeights 避免嵌套weight,那将拖累执行效率
    • UnusedResources/UnusedIds 未被使用的资源会是程序变大,并且编译速度降低。
    • Overdraw 如果为RootView指定一个背景Drawable,会先用Theme的背景绘制一遍,然后才用指定的背景,这就是所谓的“Overdraw”。 可以设置theme的background为null来避免。
    • UselessLeaf/UselessParent View或view的父亲没有用
  • Usability:Typography
    • TypographyDashes 特殊字符需用编码代替:“–”需要用“–”;“—”需要用“—”
    • TypographyEllipsis 特殊字符需用编码代替:“…”需要用“…”
    • TypographyOther 问题:“(c)”需要用“©”
  • Usability:Icons
    • IconNoDpi Icon在nodpi和指定dpi的目录下都出现。
    • GifUsage Image不要用GIF,最好用PNG,可以用JPG。
  • Usability
    • BackButton Android中不要设计有Back的按钮,Android中一般有Back的硬按键。
    • ButtonCase Button的“Ok”/“Cancel”显示大小写一定,不要全大写或全小写。有标准的资源的字符串,不要自己再定义,而要用系统定义的:@android:string/ok和@android:string/cancel
  • Accessibility
    • ContentDescription ImageView和ImageButton应该提供contentDescription
  • Internationalization
    • HardcodeText 硬编码的字符串应该在资源里定义
    • EnforceUTF8 所有XML资源文件都应该以UTF-8编码

详细问题

代码质量管理开放平台 Sonar

Sonar 把不同的代码检查工具(例如 FindBugs,PMD 等)结果加工在处理,通过量化的方式度量代码的质量变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。可集成到Jenkins中,支持在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果

这里写图片描述

Bug收集 腾讯Bugly

压力稳定性测试 Monkey 、 Monkey Demons

Monkey Demons

猜你喜欢

转载自blog.csdn.net/xiaoru5127/article/details/80983401