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

  • 定义LintModule
  • 开发lint规则
    • lint库依赖
    • 新建log检查规则
      • LogDetactor
    • IssueRegistry
  • 注册Registry
  • Android Module中做lint check的依赖
  • lint report

Android Studio上自定义lint在Android Studio3.0上有了非常简单的实现机制,在此记录一下

定义LintModule

首先需要新建一个module,选择Module类型为java lib。下一步lib的名称,包名,class名称按自己的要求来

开发lint规则

lint库依赖

在lintModule的build.gradle中引入lint的依赖

dependencies {compileOnly 'com.android.tools.lint:lint-api:26.2.0'compileOnly 'com.android.tools.lint:lint-checks:26.2.0'
}

新建log检查规则

Android项目中因为安全问题,一般都不推荐直接使用系统的log打日志。可以针对代码中的log使用给出error的红线警告。

LogDetactor

继承Detector实现的接口是Detector.UastScanner
第一步是定义这个issue,前面3个参数用来定义这个issue的id和文本信息。Category.SECURITY用来定义issue的分组,prority是错误等级,Severrity.ERROR是错误的严重程度(代码底下显示红色警告还是黄色警告),这3个参数都会影响lint的Report报告信息和分组信息。最后一个参数影响的是issue的检查范围,Log只会存在java文件中所以检查范围是java文件。

  @Overridepublic List<String> getApplicableMethodNames() {return Arrays.asList("v", "d", "i", "w", "e");}@Overridepublic void visitMethod(JavaContext context, UCallExpression node, PsiMethod method) {if (context.getEvaluator().isMemberInClass(method, "android.util.Log")) {context.report(ISSUE, node, context.getLocation(node), "请勿直接调用android.util.Log,应该使用统一Log工具类");}}

第二步就是检测出使用了log的代码,getApplicableMethodNames,可以定义这个issue检查的方法,返回的是方法名的集合。visitMethod可以用来访问类中的方法,并针对方法的信息定义报错的信息,例子就是找出"android.util.Log"的类,如果有使用 context.report打印警告信息。到这里LogDetector的检查就完成了。

IssueRegistry

写好LogDetector之后,还需要将LogDetector注册到IssueRegistry。 新建一个类并继承IssueRegistry

public class IssueRegister extends IssueRegistry {@NotNull@Overridepublic List<Issue> getIssues() {return new ArrayList<Issue>() {{add(LogDetector.ISSUE);}};}@Overridepublic int getApi() {return ApiKt.CURRENT_API;}@Overridepublic int getMinApi() {return 1;}
}

getIssues方法用来将自定义的Issue add并return,getApi方法是自定义lint的IssueRegistry默认的返回,getMinApi是兼容老版本情况下需要返回1,默认可以不用复写

注册Registry

这一步很简单,还是lintModule的build.gradle中写上这么一段代码

jar {manifest {attributes("Lint-Registry-v2": "com.lintrules.IssuesRegister")}
}

IssuesRegister就是刚才注册LogDetactor的类,把这个类的全名写到配置中即可

Android Module中做lint check的依赖

lintModule已经完成,需要将lintModule引入到项目中,不同于库的依赖,lintModule的依赖使用的是lintchecks,在需要做lint检测的module的build.gradle的依赖中加入即可

dependencies {lintChecks project(':lintrules')
}

依赖添加完成后,重新build一次项目,在Android Module中build目录下可以找到lint.jar,代表自定义lint已经添加成功了
现在如果代码中直接使用log就会出现红色的警告提示

lint report

自定义的lint还可以在lint report中生效,使用命令 ./gradlew 工程名:lint,比如这里就是./gradlew app:lint,就可以执行lint task,执行完成后就会在build文件下生成report文件夹
打开h5文件就可以看到检测的结果

Android Studio 3.0+ 版本的自定义lint检查相关推荐

  1. android studio 光标 输入法,解决IDEA2018.1.5或者Android Studio 3.0版本的输入法不跟随光标问题...

    [VSTS]让ADO.NET Entity Framework支持Oracle数据库(转载) 近期由于项目所需不得不研究Oracle数据库,回想上一次用Oracle还是07年的事情,实习时候做华晨宝马 ...

  2. Android Studio 4.0 新功能与优化

    1.前言 Android Studio又更新了,每次重大更新都给我们的生产力提升了一个台阶,当然也会带来神奇的bug,墙裂提醒各位小伙伴升级请慎重!!! [真香警告]Android Studio下载链 ...

  3. visual studio 最新稳定版本_速来围观!Android Studio 4.0 稳定版发布了

    作者:恋猫de小郭 Android Studio 4.0(2020年5月) 更新啦!此版本包含了各种新功能和改进,还有一些废弃配置. 重要提示:更新后,需要重新启动 Android Studio 才能 ...

  4. Android Studio 3.0 正式版本 发行说明 (翻译)

    前言 as终于发正式版了.赶快来看看有什么新的功能.本文采用翻译器翻译. Android Studio是为Android开发的官方IDE,包含构建Android应用程序所需的一切. 1.要获取最新版本 ...

  5. android切环境插件,Android Studio 2.0 - 插件太旧,请更新到更新版本,或设置ANDROID_DAILY_OVERRIDE环境变量...

    Android Studio 2.0 - 插件太旧,请更新到更新版本,或设置ANDROID_DAILY_OVERRIDE环境变量 我更新了Android Studio 2.0版并正常使用. 当我今天创 ...

  6. Android Studio 4.0 的 gradle-6.1.1-all.zip 下载(包含其他版本)

    转自: https://blog.csdn.net/QasimCyrus/article/details/78457609?utm_medium=distribute.pc_relevant_t0.n ...

  7. 教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考

    教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考 这是老师给我们布置的任务,我在这里做一个简单的总结,话不多说,直接上图上步骤吧 首先,在菜单栏中,点击 B ...

  8. android apt最新版本,解决Android studio 2.3升级到Android studio 3.0 后apt报错问题

    解决Android studio 2.3升级到Android studio 3.0 后apt报错问题 发布时间:2020-09-16 19:59:42 来源:脚本之家 阅读:62 作者:哈特中尉 1. ...

  9. android studio 3.0新功能介绍

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...

最新文章

  1. python编程入门与案例详解pdf-Python入门之三角函数sin()函数实例详解
  2. 超简单的java爬虫
  3. 容器资源需求、资源限制(二十二)
  4. etcd部署集群的三种方式
  5. 关于CentOS-6的默认带的mysql启动和安装问题
  6. “是男人就下100层”
  7. mpu6050 z轴校准_大渡口区上门校正检定量具外校-第三方检测计量出校准证书
  8. 怎么解log方程_微观动力学解合成氨催化反应TOF
  9. Discuz常见小问题-如何关闭验证码
  10. Android setOnPageChangeListener 过时解决
  11. MYSQL无法连接,提示10055错误尝试解决
  12. 将ip电话注册到服务器上,华为IP电话配置步骤.doc
  13. 计算机无法启动bios,笔记本进不了bios的解决方法
  14. SQLite Expert查看SQLite数据库文件没有数据的问题
  15. 品牌IP打造的实用性教程
  16. Nginx静态Web服务搭建
  17. 05_经典电影台词(一)
  18. 《管理学》第七章 激励
  19. 2019牛客暑期多校训练营(第六场) Move
  20. markdown、html转义特殊字符代码大全

热门文章

  1. Python推特开发库tweepy基本操作:Twitter for Python
  2. 普中tft彩屏驱动程序下载_51单片机 彩屏TFT-SD例程及资料下载 有FAT 红外遥控显示图片...
  3. [UE4] 使用 GUI 框架“Dear ImGui” 示例:ImguiLogWindow
  4. Blender——窗口的增加与合并
  5. 一点一点学ASP.NET之基础概念——委托
  6. flash怎么保存html,做网页如何保存网上看过的FLASH作品|怎么保存网页上FLASH
  7. 高中数学基础06:角、弧度与三角常用公式
  8. 中国合成树脂行业“十三五”发展回顾及“十四五”前景展望「图」
  9. 产品经理(PM)职责介绍
  10. 互联网乱弹之酷六的杯具