文章目录
Lint
是 Android Studio
里面提供的一个代码检查工具,相信大多数Android开发者都用过或了解过Lint,它可以用来对项目做一些基本的但却非常有必要的代码检查,以帮助开发者提升程序的可靠性和性能,以及提高程序的可维护性。比如:XML中存在无用的命名空间、代码中调用了已被弃用的API、多余的装箱操作等,Lint通通可以一次检查出来并给予提示和修改建议。
然而这样的检查仅限于检查Lint支持的问题,并且需要开发者主动操作进行检查。那我们可不可以自定义Lint检查规则呢?可不可以让Lint在我们输入代码的时候就给出错误提示呢?或者在编译项目的时侯自动检查呢?答案是:可以的。
这篇文章我们将着重讲解自定义Lint检查规则及Lint自动检查配置。但在开始之前,不妨先简单介绍一下Lint的基本使用方法。
一、Lint基本使用介绍
有两种方式可以运行Lint检查。
1. 界面操作
在 Android Studio中选择 Analyze
-> Inspect Code
,会弹出如下对话框:
在这个对话框中有两个可配置项:
Inspection scope
:选择检查的范围,可以选择整个项目检查或是只检查某些模块,也可以自定义检查范围。Inspection profile
:用来配置检查的问题项,这里点进去可以看到Lint内置的所有检查项。比如下图中用红色框标出来的,表示它支持检查Handler引用可能导致内存泄漏的问题。如果想取消某项检查,只需取消勾选就行。
点击Ok按钮,即启动Lint检查。
检查完成之后,Android Studio底部将弹出一个检查结果对话框,列出所有检查到的问题及所在文件位置,点击即可直接打开文件进行修改。如下图所示:
2 命令行运行
在Terminal中输入命令行
gradlew lint
即可启动Lint检查。检查完成后会生成一份名叫 lint-results.html
的文档,列出所有检查到的问题。
以上两种运行Lint的方式,我个人偏向于使用第一种,因为比较直观,而且检查完成后可以直接定位修改问题。
更详细的关于Lint的使用方法,请参考官方文档 Improve your code with lint checks
二、自定义Lint规则
前面我们介绍了如何运行Android Studio自带的Lint检查,以及介绍了如何查看或者勾选/取消其自带的检查规则。
自定义Lint检查规则,其实就是把自己写的规则加入到Lint里面去。这个过程有些麻烦,下面我们分步来讲解。
请注意:在不同版本的Android Studio里面,Lint检查的版本有所不同。这篇文章的内容只针对
Android Studio 4
以上的版本。
第一步:创建一个Lint规则库
首先,我们要单独建一个 Java库
来写自定义的Lint规则。请注意,是 Java Library
,不是 Android Library
。
要自定义Lint检查规则,首先需要导入两个Lint官方库,导入方式为 compileOnly
,因为Lint检查只在编译时有效。
dependencies {
compileOnly 'com.android.tools.lint:lint-api:27.1.1'
compileOnly 'com.android.tools.lint:lint-checks:27.1.1'
}
注意:这两个库的版本号必须与Android Studio里面Lint的版本号对应起来,对应关系是 Gradle plugin
的版本号加上23要等于这两个库的版本号。例如这两个库的版本号是 27.1.1
,那么com.android.tools.build:gradle
的版本号就应该是 4.1.1
,如下:
dependencies {
classpath "com.android.tools.build:gradle:4.1.1"
}
版本号如果不匹配,自定义的Lint规则将无法生效。
导入合适的库之后就可以开始自己写检查规则了,自定义规则有三个重要的类:
- Detector :用来寻找和定位代码中的问题。我们需要创建自己的探测器,来检查代码;
- Issue:用来定义和描述问题;
- IssueRegistry:问题注册器,通过该注册器,我们可以把自定义的问题注册到Android Studio里面。
我们以一个例子来详细介绍上面这三个类以及自定义Lint规则的整个过程。
假设我们的项目中封装了一个打印日志的类,名叫 LogUtil
,我们希望项目中所有要打印日志的地方都使用该类提供的方法。如果有人直接调用了 android.util.Log
来打印日志,我们就让Android Studio报错,并提示他/她使用已经封装好的 LogUtil
类。
1.1 定义Issue
Issue所定义的就是前面的 Inspection profile
列表里面的问题项。可以用如下方法创建一个Issue: