写在前面
1.静态代码检查
在了解我们的自定义Android Lint 工具之前,我们先来了解一下静态代码检查的概念以及作用。
1).定义:静态代码检查,是指不运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等检查程序的正确性,并找出代码中隐藏的错误和缺陷(比如参数不匹配、有歧义的嵌套语句、错误的递归、非法计算、可能出现的空指针引用等等)。它可以:
- 帮助软件开发人员自动执行静态代码分析,快速定位代码的隐藏错误和缺陷;
- 帮助软件设计人员更专注于分析和解决代码设计缺陷;
- 显著减少在代码逐行检查上花费的时间,提高软件可靠性的同时可以降低软件测试成本。
2).作用:静态代码检查本质上就是为了提升程序的代码质量、可靠性、安全性,它可以:
- 帮助软件开发人员自动执行静态代码分析,快速定位代码的隐藏错误和缺陷;
- 帮助软件设计人员更专注于分析和解决代码设计缺陷;
- 显著减少在代码逐行检查上花费的时间,提高软件可靠性的同时可以降低软件测试成本。
3).为什么我们要部署静态代码检查:举例来说,2014 年,一个广泛使用的 SSL 实现(Apple 开源的 SecureTransport)中被披露存在 “goto fail” 漏洞,造成其可以接受无效的 SSL 证书 [1]。2016 年,一个日期格式相关的 Bug 造成了 Twitter 大范围的服务中断 [2]。事实上,像这些 Bug,在静态代码阶段是完全可以被检测到的,通过代码审计或阅读文档,这些都是比较明显的问题,但却仍然被引入到了生产环境中。这些在静态代码阶段是完全可以被检测到的问题,在开发阶段被发现比在生产环境中被发现解决问题的成本要低得多,所以要在项目中部署静态代码检查,以达到降本增效的目的。
2.为什么要选择Lint作为静态代码检查的工具
对于Android 静态代码检查,比较主流的有: CheckStyle、FindBugs、PMD、Sonar、 Lint,而Android Lint相比于其他工具,具有以下优势:
1.功能强大,支持java源文件、class文件、资源文件、Gradle等文件的检查;
2.扩展性强,支持开发自定义lint规则;
3.配套工具完善,AndroidStudio、AndroidGradle插件支持lint工具;
4.lint专为Android设计,原生提供了几百个实用的Android相关检查规则;
5.有Google官方的支持,会和Android开发工具一起升级完善;
6.对代码正确性、安全性、性能、易用性、无障碍性和国际化方面的问题进行检查。
所以,我们选择在Android Lint工具的基础上,进行功能及规则拓展的自定义 Android Lint作为项目中的静态代码检查的工具。
自定义的Android Lint工具
1.官方Android Lint简介
为什么不直接使用官方Android Lint工具而需要自定义一个Android Lint工具呢?
首先从我们的需求出发:部署静态代码检查是为了使项目在开发阶段及时发现问题,希望对提交到远程仓库的代码自动进行静态检查(增量扫描),并在解决扫描出来的重要问题之后方可入库,以提升程序的代码质量、可靠性、安全性。
简单介绍一下Android Lint,这里贴一段Android Lint的官方介绍:
感兴趣的同学可以阅读官方文档 通过进行 lint 检查来改进代码。通过阅读官方文档得知,目前Android Lint可以在: 构建应用时执行、手动运行检查(Android Studio > Analyze > Inspect Code) 及命令行运行检查。同时输出便于理解的检查结果。
但官方Android Lint工具在使用上并不能满足我们的需求:
1).执行检查方式:手动运行检查、命令行运行检查都需要开发人员手动去执行,无法保证每个开发人员都会严格按照要求执行先检查再发布的流程;
2).检查代码范围:当前项目中使用的Android Gradle Plugin Version(4.2.0)Lint检查只支持全量扫描,这样开发人员会花费许多时间在等待应用构建上;
3).检查规则:官方的默认规则并不能完全覆盖我们的需求(比如公司要求的类、方法、变量以及layout id view id的命名规范等,自定义规则和Android默认规则的描述)。
综上所述,我们需要在官方Android Lint的基础上进行拓展,设计出符合需求的可全量/增量检查、符合规则、自动化、部署简单、结果可视化的静态代码检查工具。
2.自定义Lint工具设计思路
目前项目是基于GIT进行版本控制,既然我们希望对提交到远程仓库的代码自动进行静态检查,自然就想到使用git hooks(这里就不进行拓展,感兴趣的可以自行查看)在提交代码前插入我们的检查机制;所以我们在git commit时对我们要提交的代码进行静态代码检查(增量检查),禁止不符合规则的代码提交到远程仓库并提示开发人员进行修改;同时,目前代码仓库已经保存了许多不符合规范的代码,保留全量扫描,以方便对历史代码进行检查,解决遗留问题,保障程序的代码质量、可靠性、安全性。
下篇文章将会详细阐述如何设计自定义Lint规则
静态代码检查 - Android Lint 自定义检查规则