仓库地址

背景

1、大多代码规范都浮于表面,全靠开发自觉和Code Review来保障导致很多遗留的老大难问题。

2、基础模块很多规范只能通过注释或者文档来约束。

相关文档

安卓自定义lint实现

LintOption 文档

AS Lint支持

设计目标

开发自定义Lint规则,通过Android Studio提供的Inspections实时检测代码,对不规范的代码进行实时提示。

  • 能够实时进行代码规范提示
  • 实现仅对单个模块生效
  • 可以控制提示等级
  • 不增加包体积
  • 不占用过多的系统内存

概览

Lint相关API

1、Issue:表示一个Lint规则。
2、Detector:用于检测并报告代码中的Issue,每个Issue都要指定Detector。
3、Scope:声明Detector要扫描的代码范围,例如JAVA_FILE_SCOPE、CLASS_FILE_SCOPE、RESOURCE_FILE_SCOPE、GRADLE_SCOPE等,一个Issue可包含一到多个Scope。
4、Scanner:用于扫描并发现代码中的Issue,每个Detector可以实现一到多个Scanner。
5、IssueRegistry:Lint规则加载的入口,提供要检查的Issue列表。

自定义规则举例:实现了Serializable接口的类,引用类型成员变量也必须要实现Serializable接口

class SerializableClassDetector : BaseDetector(), Detector.UastScanner {companion object {private const val REPORT_MESSAGE = "该对象必须要实现Serializable接口,因为外部类实现了Serializable接口"val ISSUE = Issue.create("SerializableClassCheck",REPORT_MESSAGE,REPORT_MESSAGE,Category.CORRECTNESS,10,Severity.ERROR,Implementation(SerializableClassDetector::class.java, Scope.JAVA_FILE_SCOPE))}override fun applicableSuperClasses(): List<String>? {return listOf(CLASS_SERIALIZABLE)}override fun visitClass(context: JavaContext, declaration: UClass) {for (field in declaration.fields) {//字段是引用类型,并且可以拿到该classval psiClass = (field.type as? PsiClassType)?.resolve() ?: continueif (!LintMatcher.matchClass(lintConfig.serializableConfig, psiClass)) returnif (!context.evaluator.implementsInterface(psiClass, CLASS_SERIALIZABLE, true)) {context.report(ISSUE,context.getLocation(field.typeReference!!),lintConfig.serializableConfig)}}}
}
// Lint规则注册入口
class CustomIssueRegistry : IssueRegistry() {override val issues: List<Issue>get() = listOf(SerializableClassDetector.ISSUE)
}

Uast相关的继承关系:

设置提示等级

1、可以直接在Preferences-Inspections中设置问题的严重程度

Error 红色波浪线

Warning 淡黄色背景色

WeakWarning 黄色波浪线

Server Problem

2、通过lintOption进行提示等级设置

LintOption 文档

效果

目前实现的自定义lint检查实时提醒效果如下

在Android Studio 3.x版本中,打开Android工程源码后,IDE会加载工程中的自定义Lint规则,在设置菜单的Inspections列表里可以查看,和原生Lint效果相同(Android Studio会在打开源文件时触发对该文件的代码检查)。

使用方法一

自定义lint检查代码都在lint模块(Java Module)中;lintlibrary是一个空的Android Module,负责将livelint打出的jar包打入一个aar包中。

app模块通过compileOnly依赖livelibrary模块,相关的自定义检测就会只对该模块生效了,并且不会打入release包中。

使用方法二

编译完成后,将"/lint/build/libs"的"lint.jar"文件复制到(mac下)".android/lint"目录下(没有lint目录,新建一个)即可。

如果没有出现实时的静态检测提示,rebuild项目,仍然失败重新Android Studio

如果多次尝试仍然没有实时提示,只能使用./gradlew lint命令进行手动检查。

app/build/reports/lint-results.html生成的该文件中可以查看检查的详细结果。

Android自定义Lint检查-CustomLint相关推荐

  1. Android Studio 3.0+ 版本的自定义lint检查

    Android Studio 3.0+ 版本的自定义lint检查 定义LintModule 开发lint规则 lint库依赖 新建log检查规则 LogDetactor IssueRegistry 注 ...

  2. 【我的Android进阶之旅】Android自定义Lint实践

    背景 2017年8月份的时候,我在公司开始推广Lint.FindBugs等静态代码检测工具.然后发现系统自带的Lint检测的Issue不满足我们团队内部的特定需求,因此去自定义了部分Lint规则.这个 ...

  3. Android自定义Lint实践

    Android Lint是Google提供给Android开发者的静态代码检查工具.使用Lint对Android工程代码进行扫描和检查,可以发现代码潜在的问题,提醒程序员及早修正. 为保证代码质量,美 ...

  4. 自定义Lint检查规则

    文章目录 一.Lint基本使用介绍 1. 界面操作 2 命令行运行 二.自定义Lint规则 第一步:创建一个Lint规则库 1.1 定义Issue 1.2 定义Detector 1.3 定义并配置Re ...

  5. 【Android】lint检查

    1 Android lint 检查 Android lint是一个静态代码分析工具. 它会对我们的代码进行扫描和检查,提前发现问题,通过lint tool工具输出一个文件,告诉我们哪行代码有问题. 具 ...

  6. Android 自定义 Lint 实现静态代码扫描工具

    文章目录 关于静态代码扫描工具 Lint的简单使用 一.Lint 与 IDE 的结合使用 二.Lint 与 gradle 命令的结合使用 具体位置如下图: 生成的HTML在浏览器打开如图: 自定义 L ...

  7. Android Lint 检查规则的定制(基本篇)

    本人博客原文 英文原文: http://tools.android.com/tips/lint/suppressing-lint-warnings http://tools.android.com/r ...

  8. android gradle lint,Android Lint

    Android Lint 是有 Android SDK 提供的一种静态代码检测工具,用于检测 Android 的代码质量 Android Lint 的源码集成在 Android SDK Tools 1 ...

  9. Android Studio Lint 工具看完这一篇还不够

    前言 以前对下面的问题,我的态度是,不报错就是没问题,报错就用快捷键,根据Android Studio提示修复问题,从来不去问个为什么?现在代码洁癖症越来越严重的我,忍不住想看清什么东西在搞鬼. 认真 ...

最新文章

  1. 程序员跳槽全攻略——读书笔记
  2. 完整的一次 HTTP 请求响应过程(一)
  3. Android Material Design之在RecyclerView中嵌套CardView实现
  4. Mysql主主同步详细操作过程
  5. php怎麼开bcmath_php-如何启用BCMath CentOS 6
  6. 如何给小朋友解释单摆运动_模仿小天才钟美美:小朋友都是天生的演员?
  7. UGUI 屏幕适配 导致 BoxCollider无效 解决记录
  8. 营业执照psd模板2020_荣誉证书聘书奖状模板,CFR矢量素材PSD源文件,700张精美套用...
  9. 互联网运营数据分析(1):流量分析
  10. 微信小程序之去除抖音、快手等视频平台水印!
  11. C#操作Word书签
  12. QQ微信可以上网,但是google浏览器上不了网怎么办?
  13. 基因表达谱热图的绘制
  14. 计算机要学什么知识,学电脑要先学什么 学电脑要学习什么知识
  15. QQ看点模块100条测试用例
  16. Vue3 全家桶 + Element Plus + Vite + TypeScript + Eslint 项目配置最佳实践
  17. 支付宝SDK官方下载地址
  18. python3 安装urllib3
  19. 一键式打造 DAO,M-DAO 或成 Web3 新宠儿
  20. java综合技术分享

热门文章

  1. 如何使用在线客服转接功能
  2. 机器学习思维导图(更新中)
  3. 新版PF使用说明文档
  4. bypass分流抢票(火车、高铁)
  5. win10pe 找不到硬盘 戴尔_要是遇到这样 开机找不到硬盘开不了机怎么办_解决方法教程一览-...
  6. IDEA如何自动/手动导入包
  7. 《VALORANT》: 双塔迷城的诞生
  8. 关于C#如何引用Microsoft.Office.Interop.Excel
  9. 能装linux的嵌入式,试试一张软盘可装下Linux(嵌入式Linux)
  10. 雨课堂网页端作业找不到的解决方法