背景

现在正规的商业APP,大部分都会禁止在代码里直接用系统的Log直接打日志,原因大家都懂就不细说了。所以自定义一个Lint检测很有必要,如下图:

诸如此类的还有postDelayednew Threadfragment构造函数单类的代码行数等等一些列常规方法和类检测。
随便举两个例子,来说明现实场景中可能存在的问题:

  • 比如Fragment必须有空参构造函数,因为在内存不足的时候Fragment恢复默认是通过反射调用空参构造函数重建Fragment
  • 比如直接使用了kt的扩展函数String.toInt,当服务端返回string不符合int的时候会发生NumberFormatException异常

这类问题在测试环境很难测出,review阶段也可能没注意到,直到灰度甚至全量在线上出现crash才被发现。
而Lint就是这么一种可以较低侵入、损失提前的解决方案。

当然除此之外,作为TL或者更高层面的角色,是希望大家能按照某种规则,把相关代码都写在统一要求的位置,那其实Lint也是不难做到的,如下图:

知识点储备

Lint是什么

In addition to ensuring your app meets its functional requirements by building tests, it’s important that you also ensure your code has no structural problems by running the code through lint. The lint tool helps find poorly structured code that can impact the reliability and efficiency of your Android apps and make your code harder to maintain.
For example, if your XML resource files contain unused namespaces, this takes up space and incurs unnecessary processing. Other structural issues, such as use of deprecated elements or API calls that are not supported by the target API versions, might lead to code failing to run correctly. Lint can help you clean up these issues.

官网说的废话比较多,相信读者看完背景里提到的的例子已经大概能了解Lint能做什么,那我对Lint的理解是在代码生产过程中(编码、编译、git commit、CI阶段),用于提示开发者代码可能存在的问题,以及如何修复的这么一种轻量检测工具。

Lint的优势

  • 功能强大,支持Java和Kt源文件、class文件、资源文件、Gradle等文件的检查
  • 扩展性强,支持开发自定义Lint规则
  • 有Google官方的支持,会和Android开发工具一起升级完善
  • 在代码生产过程中全链路支持(编码、编译、commit、Gitlab CI)
  • 支持文件导出html、xml,以及定义从某一个版本开始检测

自定义Lint开发流程

正题

Lint API

Issue 代表您想要发现并提示给开发者的一种问题,包含描述、更全面的解释、类型和优先级等等。官方提供了一个 Issue 类,我们只需要实例化一个 Issue,并注册到 IssueRegistry里

IssueRegistry Lint规则加载的入口,提供要检查的Issue列表,详见下面的代码

Detector 负责扫描代码并找到有问题的地方,然后把它们报告出来。一个 Detector 可以报告多种类型的 Issue,可以针对不同类型的问题使用不同的严重程度

Scanner 用于扫描并发现代码中的Issue,每个Detector可以实现一到多个Scanner,具体如下表

需要实现的Scanner 类描述
UastScanner/SourceCodeScanner 扫描 Java 文件和 Kotlin 文件
ClassScanner 扫描 Class 文件
XmlScanner 扫描 XML 文件
ResourceFolderScanner 扫描资源文件夹
BinaryResourceScanner 扫描二进制资源文件
OtherFileScanner 扫描其他文件
GradleScanner 扫描 Gradle 脚本

举个最简单的

自定义AndroidLint在得物社区的实践分享相关推荐

  1. 社区发现 实践_实践社区可以为您的组织做什么

    社区发现 实践 正如我在本系列第一部分中讨论的那样,社区是开放组织中的基本原则. 在开放式组织中,人们通常通过共同的兴趣和激情来定义自己的角色,职责和从属关系,而不是组织结构图上的头衔,角色或职位 . ...

  2. Apache Flink Meetup,1.13 新版本发布 x 互娱场景实践分享的开发者盛筵!

    简介: Flink 1.13 版本新功能的深入解读+Flink 在互娱行业典型实践应用. 对于广大的 Flink 开发者同学来说, 什么内容是最期待的? 什么信息又是最有用的? 最期待的内容,自然是 ...

  3. 【Electron】酷家乐客户端开发实践分享 — 下载管理器

    作者:钟离,酷家乐PC客户端负责人 原文地址:webfe.kujiale.com/electron-ku- 酷家乐客户端:下载地址 www.kujiale.com/activity/13- 文章背景: ...

  4. 【Electron】酷家乐客户端开发实践分享 — 浏览器启动客户端

    作者:钟离,酷家乐PC客户端负责人 原文地址:webfe.kujiale.com/browser-to-- 酷家乐客户端:下载地址 www.kujiale.com/activity/13- 文章背景: ...

  5. 接口测试系列 | 莉莉丝公司接口测试实践分享

    Testerhome社区爱好者合力编写了<2021接口测试白皮书>,并于今年2月底发布.本文节选自其中的的「莉莉丝公司接口测试实践分享」章节.点击链接可下载完整版<2021接口测试白 ...

  6. 回顾 | Apache Flink 1.13 新版本 x 互娱实践分享 Meetup · 北京站精彩回顾 (附 PPT 下载)

    简介:PPT下载链接来啦! GitHub 地址 https://github.com/apache/flink 欢迎大家给 Flink 点赞送 star~ 5 月 22 日,Apache Flink ...

  7. 前端开发还可以这么玩?元数据实践分享

    摘要:元数据是业务流中前端和业务侧实现共同使用的一种规范,是沟通前后端的桥梁,其通过统一的数据格式进行约束,从而约定前后端传参.使用元数据,大幅提升了开发效率,又降低了维护及二次开发成本. 1 ROM ...

  8. Kubernetes 网络改进的三项实践分享

    自研CNI IPAM插件 解决K8s功能问题 首先,在功能方面,Kubernetes 网络模型由于IP不固定,无法对IP资源进行精细管控,无法使用基于IP的监控和基于IP的安全策略,此外,一些IP发现 ...

  9. 阿里云DataWorks数据集成(DataX)架构实践分享

    阿里云DataWorks数据集成(DataX)架构&实践分享 分享嘉宾:罗海伟 阿里云 编辑整理:约理 中国科学院大学 目录 ▌为什么需要数据集成 数据集成的应用场景 数据集成的角色和地位 ▌ ...

最新文章

  1. 特征工程在实际业务中的应用!
  2. 波特率、比特率、速率、通信速度
  3. ssd测试软件cy,目标检测实践_tensorflow版SSD模型测试
  4. WebRTC音频预处理单元APM的整体编译及使用
  5. 【PP操作手册】成品入库和订单报工
  6. 计算机软件技能高考好考么,湖北技能高考:上不了本科,优先考虑这4所一档高职...
  7. eclipse中如何配置tomcat
  8. vue中设置height:100%无效的问题及解决方法
  9. 这个小伙因WannaCry勒索软件一夜成名,获得一年免费披萨
  10. easyui-textbox 和 easyui-validatebox 设置值和获取值
  11. 驱动该如何入门 关于file_operations和Linux设备模型
  12. MD5(JavaScript)
  13. 考研--线性代数辅导讲义(第一章行列式 第二章矩阵)
  14. 定积分的一些常用结论
  15. 什么是UPS UPS的选购技巧介绍
  16. JavaScript+css实现的喜庆活动邀请函多页面html源码
  17. python练手小程序—调整图片分辨率(大小)
  18. 数据库编程需要下载什么软件
  19. Unity - 计算两个向量之间的夹角
  20. Lotto POJ-2245

热门文章

  1. IOS 用户登录界面
  2. java 德生读卡器对接程序_第三章:java流程语句
  3. MOOC-浙江大学-博弈论基础-学习笔记(九)
  4. NodeJS使用Express框架进行POST请求报“BadRequestError:request aborted”
  5. 使用(SIFT特征KMeans聚类关键点训练SVM)实现自然图像中的logo商标识别和定位
  6. IT忍者神龟之MySQL函数详细描述
  7. 第十次作业 - 项目测评
  8. 为什么还在纠结C++,看了这个就不言自明了。
  9. c++ 懒羊羊找朋友
  10. 制作死链接的几种方法