iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Android代码检查规则Lint怎么自定义与应用
  • 711
分享到

Android代码检查规则Lint怎么自定义与应用

2023-06-30 00:06:34 711人浏览 安东尼
摘要

今天小编给大家分享一下Android代码检查规则Lint怎么自定义与应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:

今天小编给大家分享一下Android代码检查规则Lint怎么自定义与应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

前言:

在日常的代码开发中,此处相信每个开发人员对代码质量都是高要求,有自己的一套代码规范,但是我们不是单独作战,往往大家都是团队作战,人是最大的变量,各人各异,如何保证团队的代码质量和代码规范呢?靠开发者自觉吗?也许有的团队有严格的CR机制,在MR阶段会进行CR,CR不通过的MR是不允许合入的,但是这样会使Reviewer花费较多的时间去校验,那么这时候我们就需要在编码过程中提供一种代码检测机制。

例如:期望表现的效果就是在编码时可以展示异常检测的方法,高亮或者标红,当鼠标悬停在高亮的代码上时,会提供问题的描述和解决方法。需要这种效果,就需要自定义lint了。

Android代码检查规则Lint怎么自定义与应用

什么是Lint

在Android Studio中提供的代码扫描工具Lint,可在无需实际执行该应用,也不必编写测试用例的情况下帮助开发者发现代码质量问题和提出一些改进建议。

Lint工具可检查您的 Android 项目源文件是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进。在使用 Android Studio 时,配置的 Lint 和 IDE 检查会在您每次构建应用时运行。不过,您可以手动运行检查或从命令行运行 Lint。

android studio内置了较多的lint规则,但内置的lint规则无法满足直观的适合我们时,就需要我们自定义lint了。

Android代码检查规则Lint怎么自定义与应用

自定义Lint流程:

1. 新创建module,Module类型选择Java or Kotlin Library, 暂时命名lint_tools

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

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

在moudle中依赖了lint-api和lint-checks,其中lint-api就是lint相关的api,lint-checks就是android studio里自定义的一些lint规则,我们自定义lint可以参考lint-checks里面的写法。

3. 本地创建个资源id命名检查规则,用来规范项目中的id统一命名

创建ViewIdDetector,直接继承LayoutDetector(也可以继承ResourceXmlDetector 或者 继承Detector实现的接口是XmlScanner,方式多样)

import com.android.SdkConstantsimport com.android.tools.lint.detector.api.*import com.android.tools.lint.detector.api.CateGory.CompaNIOn.CORRECTNESSimport com.android.tools.lint.detector.api.Scope.Companion.RESOURCE_FILE_SCOPEimport org.w3c.dom.Elementclass ViewIdDetector : LayoutDetector() {        override fun getApplicableElements(): Collection<String>? {        return listOf(            SdkConstants.TEXT_VIEW,            SdkConstants.IMAGE_VIEW,            SdkConstants.BUTTON        )    }    override fun visitElement(context: XmlContext, element: Element) {        if (!element.hasAttributeNS(SdkConstants.ANDROID_URI, SdkConstants.ATTR_ID)) {            return        }        val attr = element.getAttributenodeNS(SdkConstants.ANDROID_URI, SdkConstants.ATTR_ID)        val value = attr.value        if (value.startsWith(SdkConstants.NEW_ID_PREFIX)) {            val idValue = value.substring(SdkConstants.NEW_ID_PREFIX.length)            var matchRule = true            var expMsg = ""            when (element.tagName) {                SdkConstants.TEXT_VIEW -> {                    expMsg = "tv"                    matchRule = idValue.startsWith(expMsg)                }                SdkConstants.IMAGE_VIEW -> {                    expMsg = "iv"                    matchRule = idValue.startsWith(expMsg)                }                SdkConstants.BUTTON -> {                    expMsg = "btn"                    matchRule = idValue.startsWith(expMsg)                }            }            if (!matchRule) {                context.report(                    ISSUE,                     attr,                     context.getLocation(attr),                     "ViewIdName建议使用view的缩写_xxx; ${element.tagName} 建议使用 `${expMsg}_xxx`"                )            }        }    }    companion object {        val ISSUE: Issue = Issue.create(            "ViewIdCheck",            "ViewId命名不规范",            "ViewIdName建议使用 view的缩写加上_xxx,例如tv_xxx, iv_xxx",            CORRECTNESS,            5, Severity.ERROR,            Implementation(                ViewIdDetector::class.java,                RESOURCE_FILE_SCOPE            )        )    }}

自定义Detector可以实现一个或多个Scanner接口,选择实现哪种接口取决于你想要的扫描范围。
Lint API 中内置了很多 Scanner:

Scanner 类型Desc
UastScanner扫描 Java、Kotlin 源文件
XmlScanner扫描 XML 文件
ResourceFolderScanner扫描资源文件夹
ClassScanner扫描 Class 文件
BinaryResourceScanner扫描二进制资源文件
GradleScanner扫描Gradle脚本

4. 实现IssueReGIStry并添加对应的自定义Issue:

class IMockIssueRegistry: IssueRegistry() {    override val issues: List<Issue>        get() = listOf(            ViewIdDetector.ISSUE        )}

5. 在module(lint_tools)中对应的build.gradle中配置如下信息:

jar {    manifest {        attributes("Lint-registry-v2": "com.imock.lint.IMockIssueRegistry")    }}

6. 在需要进行lint检查的module中或者app目录现的build.gradle中引用对应的lint_tools即可使用。

dependencies {    lintChecks project(path: ':lint-tools')}

至此你可以试着自己自定义Lint了,相关语法api都可参考lint-checks中提供的Detector实现,来实现自己的Lint检查规则。

拓展一下:

1. 针对Issue.create参数了解一下:

companion object {        @JVMStatic    fun create(        id: String,        briefDescription: String,        explanation: String,        category: Category,        priority: Int,        severity: Severity,        implementation: Implementation    ): Issue {        val platfORMs = computePlatforms(null, implementation)        return Issue(            id, briefDescription, explanation, category, priority,            severity, platforms, null, implementation        )    }}
  • 参数id 唯一的id,简要表面当前提示的问题。

  • 参数briefDescription 简单描述当前问题

  • 参数explanation 详细解释当前问题和修复建议

  • 参数category 问题类别

  • 参数priority 优先级,从1到10,10最重要

  • 参数Severity 严重程度:FATAL(奔溃), ERROR(错误), WARNING(警告),INFORMATIONAL(信息性),IGNORE(可忽略)

  • 参数Implementation Issue和哪个Detector绑定,以及声明检查的范围。Scope有如下选择范围:RESOURCE_FILE(资源文件),BINARY_RESOURCE_FILE(二进制资源文件),RESOURCE_FOLDER(资源文件夹),ALL_RESOURCE_FILES(所有资源文件),JAVA_FILE(Java文件), ALL_JAVA_FILES(所有Java文件),CLASS_FILE(class文件), ALL_CLASS_FILES(所有class文件),MANIFEST(配置清单文件), PROGUARD_FILE(混淆文件),JAVA_LIBRARIES(Java库), GRADLE_FILE(Gradle文件),PROPERTY_FILE(属性文件),TEST_SOURCES(测试资源),OTHER(其他);

以上就是“Android代码检查规则Lint怎么自定义与应用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Android代码检查规则Lint怎么自定义与应用

本文链接: https://www.lsjlt.com/news/326887.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android代码检查规则Lint怎么自定义与应用
    今天小编给大家分享一下Android代码检查规则Lint怎么自定义与应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:...
    99+
    2023-06-30
  • Android代码检查规则Lint的自定义与应用详解
    目录前言:什么是Lint自定义Lint流程:1. 新创建module,Module类型选择Java or Kotlin Library, 暂时命名lint_tools2. 在buil...
    99+
    2024-04-02
  • 怎么在Android应用中自定义dialog
    这篇文章将为大家详细讲解有关怎么在Android应用中自定义dialog,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Android 自定义dialog要点:设置自定义dialog的布局文件...
    99+
    2023-05-31
    android dialog roi
  • 怎么调试Cordova应用的JavaScript代码和自定义插件代码
    这篇文章主要讲解了“怎么调试Cordova应用的JavaScript代码和自定义插件代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么调试Cordova应用的JavaScript代码和自...
    99+
    2023-06-05
  • ContentProvider怎么在Android应用中实现自定义
    这篇文章给大家介绍ContentProvider怎么在Android应用中实现自定义,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1,创建一个数据库帮助类,归根结底都是它在操作数据库。代码如下:package com....
    99+
    2023-05-31
    android contentprovider roi
  • 怎么在Android应用中自定义一个数字键盘与密码输入框
    这期内容当中小编将会给大家带来有关怎么在Android应用中自定义一个数字键盘与密码输入框,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。控件实现清单: 1)集成于EditText的输入框控件:P...
    99+
    2023-05-31
    android roi
  • Android应用中怎么实现自定义状态栏
    这篇文章给大家介绍Android应用中怎么实现自定义状态栏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、目标:Android5.0以上二、步骤1、在res-values-colors.xml下新建一个RGB颜色 ...
    99+
    2023-05-31
    android roi
  • Android应用中怎么自定义一个菜单栏
    这期内容当中小编将会给大家带来有关Android应用中怎么自定义一个菜单栏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在android开发的过程中系统自带的菜单往往满足不了开发中的一些需求,比如说一排最...
    99+
    2023-05-31
    android roi
  • Android应用中怎么自定义一个圆形进度条
    这期内容当中小编将会给大家带来有关Android应用中怎么自定义一个圆形进度条,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。A.绘制圆环,圆弧,文本//1.画圆环//原点坐标float circleX =...
    99+
    2023-05-31
    android roi
  • 怎么使用Java Stream API将List按自定义分组规则转换成Map
    小编给大家分享一下怎么使用Java Stream API将List按自定义分组规则转换成Map,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!测试数据是List里的...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作