某学姐

Android Female Developer, Technology Fan, Reader.

Kotlin静态代码检测方案分析

2019-04-26 | Comments

和Java静态代码检测一样,Kotlin静态代码检测包含两方面的检查:代码风格代码质量两方面。

Java代码风格检查使用的是CheskStyle,代码质量检查使用的是FindBugs

Kotlin作为一门新兴语言,代码检测的方案大概有如下4种:

  1. Ktlint https://github.com/pinterest/ktlint
  2. Detekt https://github.com/arturbosch/detekt
  3. 增强Android Studio的Lint对Kotlin代码检测的能力
  4. 增加FindBugs对Kotlin代码检测的能力 http://findbugs.sourceforge.net/

静态代码检测整体思路都差不多,使用Kotlin编译器解析Kotlin类分析语法树进行处理,最大差别在于RuleSet规则集的不一样。

方案分析

(1) Ktlint主要用来对代码风格进行检查,和Java中的CheckStyle类似,规则参考的是Kotlin官方代码风格规范 https://developer.android.com/kotlin/style-guide

规则集在ktlint-ruleset-standard目录下
ktlint-rules

(2)Detekt包括代码风格和代码质量两个方面的检查。
代码风格检查沿用了Ktlint的功能,在其基础上进行了一层包装。
代码风格的规则集在detekt-formatting目录下
detekt-format-rules

随便点一个类进去看,发现就是使用的Ktlint的Rule。
detekt-rule-sample

代码质量的规则集主要在detekt-rules目录下,一个包对应一个分类,每个包下的一个类对应一个rule case。
bugs和performance包下是一些潜在bug和性能的规则集。
detekt-rules

(3)Lint也支持Kotlin代码检查,但是看起来只是支持简单的代码风格检查,不够完善。
lint-kotlin

美团点评通过自定义Lint的方式实现Kotlin代码检查
https://tech.meituan.com/2018/07/05/kotlin-code-inspect.html

这个文档是2018年写的,到现在已经过去一年了。

(4)FindBugs暂时是不支持Kotlin代码检查的

总结分析

(1)Ktlint只支持代码风格检查,如果要支持代码性能检查的话,需要大量扩展代码性能规则集
(2)Detekt支持代码风格检查和代码性能检查,代码风格检查完全复用Ktlint,代码性能检查规则集也比较完善,且支持规则集扩展,并且开源一直在维护中,代码更新比较频繁。
(3)Lint暂时只支持简单的代码风格检查,想扩展的话需要把Lint检测原理搞懂,并且需要写大量规则集,这些东西Detekt其实已经帮我们做了
(4)FindBugs完全不支持Kotlin检查,采用这种方案需要我们修改FindBugs,从零开始去搞清楚怎么检查Kotlin代码,以及从零开始去定义规则集

最终结论

使用Detekt方案是最合适,性价比是最高的。

方案实施

(1)先接入Detekt,使用已有的代码检测能力。
(2)随着Kotlin代码的深入使用,对于Detekt不支持的性能问题,可以参考如下一些性能点去扩展,达到和FindBugs一样的能力。

Detekt自定义规则集扩展方法:
https://arturbosch.github.io/detekt/extensions.html

Kotlin性能点参考:
https://medium.com/@BladeCoder/exploring-kotlins-hidden-costs-part-1-fbb9935d9b62
https://medium.com/@BladeCoder/exploring-kotlins-hidden-costs-part-2-324a4a50b70
https://medium.com/@BladeCoder/exploring-kotlins-hidden-costs-part-3-3bf6e0dbf0a4

本文原文发自 某学姐, 转载请保留出处, 谢谢.

Comments