点击上方蓝字关注我们噢~

Lint是什么
Lint是google提供的一款静态代码扫描工具,目的是帮助开发者发现代码的质量问题。

相对于其他的工具,Lint有如下优势:
1)功能强大,支持java文件、class文件、资源文件、Gradle等文件的检测。
2)与android studio天然集成,可一键完成lint检测。
3)Lint专为android设计,规则丰富,原生已提供几百个实用规则。
4)扩展性强,支持自定义lint规则
......
02Lint的原理
Lint功能如此强大,具体Lint是如何做到的?下图是Lint扫描的工作流。
Lint.jar是整个lint的核心及入口,并在lint.jar中调用lint-api.jar及lint-checks.jar。
Lint-api.jar主要是对api进行一些封装,而lint-checks主要是内置规则的一些实现,下文将简单介绍整个lint的加载过程。








CheckProject方法又继续调用runFileDetectors进行分析。


Lint的重要概念
Lint提供一些API,我们可以根据API来编写自定义的规则,但其中涉及几个重要的概念,理解清楚有助于我们编写规则。具体的概念如下: Issue: 表示一条规则。 IssueRegistry: 用于注册Issue。自定义的Lint最终会生成jar包,jar包的Manifest须指向IssueRegistry类。 Detector: 检测单元。每个Issue对应一个Detector。 Scope: 声明Detector作用域,即扫描代码的范围,如java源文件、xml资源文件、Gradle文件等。 Scanner: 扫描单元。扫描并发现代码中的Issue。每个Detector可以实现一个或多个Scanner。自定义Lint主要工作就是实现Scanner。04自定义lint
原理介绍差不多了,大家一定迫不及待想看看到底如何自定义lint吧。下面将介绍如何创建自定义lint。

创建Java Library
Android Studio中选择新建Module,选择Java Library
Gradle Plugin版本,请选择2.3.3,Gradle 版本选择3.3,否则一些包会找不到

项目目录下build.gradle修改,重点是依赖的版本号及maven目录



编写自定义lint
Registry注册Issue,如下我们注册一个名为VSecureRandomDetector的ISSUE


创建aar库
由于最终需要将jar集成到android工程中,所以我们需要将jar打包成aar文件,方便集成到android工程中。
创建android Library


自定义Lint集成
将libarr-debug.aar包放到项目目录的libs目录下,如果没有可以新建一个libs目录。然后在build.gradle中引入aar,具体可以参考下图:




Lint调试
编写规则过程,不可避免会出现错误,那我们能否去调试规则代码?当然可以。调试时,我们需要通过remote远程到项目上,执行调试。具体如下: 在规则项目中,建立remote,选择自己的代码模块,其他默认参数▼
总结
自定义lint集成的过程中,踩了很多坑,大部分是环境的问题,如gradle的版本、android studio的版本等。
整个环境打通后,后续的工作就是研究规则编写。这部分内容,一方面需要理解lint的重要概念、加载原理,内容上文已介绍;另一方面需要贴合自身的业务,这部分不详细阐述。
本文主要起抛砖引玉的作用,欢迎拍砖。
参考: 1.https://developer.android.com/studio/write/lint?hl=zh-cn 2.https://tech.meituan.com/2018/04/13/waimai-android-lint.html
长按关注 更多安全技术干货等你发现