Android 工程师需要了解的 Lint 知识入门篇

2023-10-27

前言

项目开发过程中,通过对代码规范的约束对于代码质量的提升是非常重要的。这其中除了人为的代码审查之外,我们还可以使用 lint 工具来定位并修改一些有问题的代码,帮助提高我们的代码规范程度。今天我们就一起来学学 lint 的使用。

自动提示

Android Studio 内置了很多常用的 lint 规则,我们在平时中都能使用到。比如我们直接调用一些可能引发空指针的方法,就会出现如下图中的提示。我们平时开发过程中需要关注到这些提示并进行对应的修改。

SK9IQQfwpZB9ZzLbaePDi2hmyl4YfLrL4J83zF73iI0.png

手动调用

除了自动提示,我们还可以在 Android Studio 的终端运行gradlew lint 就可以,等运行完成后会看到类似如下提示。

> Task :cameralibrary:lintSxfDebug
Wrote HTML report to file:///D:/project/app-project/build/reports/lint-results-sxfDebug.html

我们可以打开生成的 html 文件,具体对照着查看哪些代码是有问题的。

html 中详细的列出了检测出来的代码和具体的问题,如图所示。

SdwUj4PGVA2H-jWPMb1wb6JIKaI_IvuCvLnbRokczIQ.png
如果某些问题配置的错误等级是可以中断编译流程的,我们的 lint 流程也会被中断,并提示 BUILD FAILED in 1m 11s ,这时候我们就需要检查下具体的问题点并进行修改了。当然我们也可以在 build.gradle 文件中配置忽略中断编译,见下一小节。

检查配置

在代码中我们可以使用@SuppressLint 来停止 lint 检查。@SuppressLint("MissingPermission") 可以禁止权限检查,@SuppressLint("all") 可以禁止所有检查。

在 xml 文件中也是同样的可以通过tools:ignore="NewApi,StringFormatInvalid" 来进行配置。

在模块的build.gradle 文件中,我们也可以进行一些配置,比如上一节中的忽略中断编译等。

android {
    ...
    lintOptions {
        // 禁止某些检查
        disable 'TypographyFractions','TypographyQuotes'
        // 开启某些检查
        enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
        // 只开启某些检查,这个选项会覆盖上面两个选项
        checkOnly 'NewApi', 'InlinedApi'
        // true 关闭分析进度展示
        quiet true
        // true(默认)错误会中断编译
        abortOnError false
        // true 只报告 error
        ignoreWarnings true
        // 建立基准文件
        baseline file("lint-baseline.xml")
    }
}
...
​

这里的基准文件相对于当前版本的一个快照,第一次设置的时候会生成,之后的检查提示就会基于当前版本新增部分的代码进行了,而不是对已有代码进行,这样方便我们一些已有的项目也可以方便的使用 lint 检查了。

注解支持

lint 配合注解可以发挥更大的作用,在代码开发中,我们也可以适当的使用这些注解。

null 注解

@Nullable 代表可空

@NonNull 代表非空

代码中我们对于一些数据可以添加上这两个注解,当然在 kotlin 里面就不需要了。

资源注解

@StringRes

我们设置一些资源时,这些资源系统都会时通过 R 类的 int 类型传递的,可能会导致传递错误,这个注解就是用在这种情况下的,类似的还有@DrawableRes @DimenRes @ColorRes 等。

值约束注解

@IntRange@FloatRange@Size 注解可以验证我们传递的参数。

    fun setHour(@IntRange(from = 0, to = 24) h: Int) { }
​
    fun setSpeed(@FloatRange(from = 0.0, to = 1.0) s: Float) { }
​
    fun getLocation(@Size(2) list: List<Double>) { }

Typedef 注解

@IntDef@StringDef 注解可以创建整数和字符串的集合来替代枚举的使用。代码如下。

@StringDef(IN, OUT)
@Retention(AnnotationRetention.SOURCE)
annotation class Type
​
const val IN = "IN"
const val OUT = "OUT"

我们在使用时就可以通过@TransContractType type: String 来约束传入的数据。

Keep 注解

@Keep 可以加在方法和类上,避免混淆时被删除。

总结

借助于 lint 工具,在平时开发中能够及时发现一些存在问题的代码,提高我们应用的可靠性,减少我们找 bug 的时间。也能够提高团队成员的代码规范性,整体上提高我们的工作效率。所以,赶快学起来用起来吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 工程师需要了解的 Lint 知识入门篇 的相关文章

  • 房间数据库更改未触发观察者

    当房间数据库更改时 我试图更新 RecyclerView 但是 当数据库发生更改时 不会调用 MainActivity 中定义的观察者的 onChanged 方法 如果我让 DAO 返回 LiveData 而不是 List 并在 ViewM
  • 使用 JSONArray 还是普通数组来存储/读取数据更有效?

    我正在使用一个连接到PHP MySQL返回所有内容的服务器JSON格式 例如 用户列表作为JSONArray of JSONObject 每个对象都包含单个用户的信息 姓名 位置 电话号码等 处理这种格式的信息时 将所有内容保留在其中会更有
  • Android:初始化本机 AudioRecord 对象时 AudioRecord 错误代码 -20

    Android 我想从麦克风读取缓冲区 以便我可以对其执行处理 以下是我的代码 int sampleRateInHz 8000 44100 22050 and 11025 int channelConfig AudioFormat CHAN
  • 当满足条件时,如何以编程方式更改 ImageButton src 目标?

    我有一个学校项目 我正在尝试开发一个手电筒应用程序 对于开 关 ImageButton 我想要 4 个自定义图像 如果手电筒关闭 turn on png 默认 turn on pressing png 按下状态 true 如果手电筒打开 t
  • 吉夫伦致命信号11

    我正在尝试使用一些本机代码来创建 Gif 我使用绘画绘制图像 创建一些笔画 单击 保存 绘制的图像将保存为 JPG 格式 当我单击 创建 Gif 时 它会获取所有图像并开始创建 gif 这是当我收到致命信号 11 并且应用程序重新启动时 我
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 需要 Android webview window.open() 和 window.close() 的信息

    我正在开发一个安卓应用程序 这是我网站的 WebView 该网站包含一个弹出按钮 单击该按钮后 将打开一个新窗口并显示内容 该链接可以来自外部站点 然而 当我实现此操作时 新选项卡正在打开 之后它会弹出以打开浏览器 尽管在 Web 视图中打
  • Ionic 2 RC0 和 Angular 2 最新的 Android 构建错误(ngc:错误:静态解析符号值时遇到错误)

    当我使用构建android时出现错误ionic build android命令 ngc 错误 静态解析符号值时遇到错误 引用本地 非导出 符号 字典 考虑导出符号 原始 ts文件中的位置14 8 解析符号TRANSLATION PROVID
  • React Native Expo StackNavigator 重叠通知栏

    我正在尝试为我的 React Native Expo 应用程序实现导航栏 这里有一个问题 dependencies expo 18 0 3 react 16 0 0 alpha 12 react native 0 45 1 react na
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • MIUI 权限被拒绝活动 KeyguardLocked

    当应用程序处于后台且屏幕被锁定时 我无法启动活动 没有异常或警告 只是不调用 onCreate 我一直在与这个问题作斗争 我想我终于找到了它的根源 日志中有一行 D com android server am ExtraActivityMa
  • Android 中的 OpenGL 缩小

    我正在使用 3D 对象并渲染它并通过扩展 GLSurfaceView 实现渲染器来显示它 问题是如何通过捏合和捏合进行缩小 下面是我的班级 package com example objLoader import java nio Byte
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 无法使用 findViewById() 找到视图

    我找不到TextView通过致电findViewById 即使 ID 确实存在 OtherActivity public class OtherActivity extends Activity Override protected voi
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 离子初始加载时间

    我正在使用 Ionic 构建一个简单的应用程序 但我的应用程序在冷启动时的初始加载时间方面存在性能问题 这是我所做的 collection repeat 代替带有 track by 的 ng repeat 原生滚动 overflow scr
  • Android 标记如何实现拖放?

    你好 我正在 Android 中开发 MapView 应用程序 我有三个标记 我希望稍后能够使用 Google Map API getlocation function 为了尝试一下 我想使用拖放功能移动标记 然后检查位置 任何人都可以通过
  • fs-extra:源和目标不能相同。 (科尔多瓦)

    我在使用 cordova 构建时遇到错误 Error Source and destination must not be the same 构建系统 Ionic ionic cli 4 10 1 ionic framework ionic
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • 如何访问我的 Android 程序中的联系人

    我正在制作一个短信应用程序 并且想要访问我的 Android 应用程序中的联系人 我想访问联系人 就像他们在实际联系人列表中一样 选择后 我需要返回到我的活动 在其中我可以向该人发送短信 或者是否可以访问存储联系人的数据库 我的代码如下所示

随机推荐

  • vscode安装_VsCode安装shader glsl环境

    在扩展tab中搜索Shader languages support for VS Code sls for vs code插件 2 安装后搜索glsl canvas 并安装 glsl canvas插件 至此环境安装完成 可新建个工程测试 测
  • v-model cannot be used on v-for or v-slot scope variables because they are not writable报错问题解决方案

    报错 错误代码 div div
  • redis 集合排重_使用Redis的有序集合实现排行榜功能

    游戏中存在各种各样的排行榜 比如玩家的等级排名 分数排名等 玩家在排行榜中的名次是其实力的象征 位于榜单前列的玩家在虚拟世界中拥有无尚荣耀 所以名次也就成了核心玩家的追求目标 一个典型的游戏排行榜包括以下常见功能 能够记录每个玩家的分数 能
  • ros tf

    欢迎访问我的博客首页 tf 1 tf 命令行工具 1 1 发布 tf 1 2 查看 tf 2 参考 1 tf 命令行工具 1 1 发布 tf 我们根据 cartographer ros 的 launch 文件 backpack 2d lau
  • 【Python】《Python编程:从入门到实践 (第2版) 》笔记-Chapter2-变量和简单数据类型

    二 变量和简单数据类型 在程序中可随时修改变量的值 而Python将始终记录变量的最新值 message Hello Python world print message message Hello Python Crash Course
  • hashCode的性能优化

    本文主要讨论下不同的hashCode 实现对应用程序的性能影响 hashCode 方法的一个主要作用就是使得对象能够成为哈希表的key或者散列集的成员 但同时这个对象还得实现equals Object 方法 它和hashCode 的实现必须
  • visio图标_弱电间机柜原型图整理,可编辑!(Excel,visio,CAD)

    有朋友问到机柜原型图 这个我们在弱电vip技术群里面也有朋友提到过 今天我们就整理了弱电系统中常用的机柜原型图 有Excel visio CAD版本 可以修改编辑 1 Excel机柜原型图 可编辑 机柜布局 1 机柜布局 2 机柜布局 3
  • C++全局对象初始化依赖关系处理

    class A private int m nSize public A m nSize 100 m pList new char 4 memset m pList 0 sizeof 4 sizeof char int GetSize re
  • 使用基础粒子群(PSO)算法求解一元及二元方程的Python代码

    最近在看清风的数学建模视频 其中有两道题 求一元函数的最值问题 题目 求函数 y 11 s i n x
  • 小谈Intel SGX

    目录 Intel SGX简介 背景 为什么要Intel SGX Intel SGX尚处于学术讨论 Intel SGX和可信启动什么关系 开发者眼中SGX长什么样子 SGX访问控制是什么 MEE与SGX EPC内存加密 CPU里面SGX长什么
  • 深度学习笔记(一):环境(yolov5)配置

    前言 本文为笔者在学习深度学习 进行环境配置时集各家所长总结的一些经验 旨在能够较快的配置好深度学习所需的环境 一 软件安装 1 1 Anaconda安装 直接在官网下载 Anaconda官网链接 安装包下载完毕后 进行安装 更改安装路径
  • CSS属性纪要

    1 line height 行高 跟font size属性的大小有关 一般可用来设置元素垂直居中 1 单行文字或单张图片的垂直居中 div 你好你好 div 以以上代码为例 设置box和height和line height高度一样就可以垂直
  • 原子锁

    Windows核心编程 Interlocked原子访问系列函数 http blog csdn net zhongguoren666 article details 7542975 InterlockedExchange http blog
  • 时间序列的数据分析(一):主要成分

    时间序列是一组按照时间发生先后顺序进行排列 并且包含一些信息的数据点序列 在时间序列数据中通常包含了数据的发展趋势 向上 向下 保持 和数据的变化规律 季节性 等特征 而这些特征往往具有一定的规律性和可预测性 具体来说时间序列数据具有如下几
  • BES2300 代码主架构笔记

    1 BES的内核用的是RTX的内核 并且用了ARM推广的CMSIS RTOS API接口 这样做的好处是可以方便内核的更换 方便移植上层代码 2 程序是从RTX CM LIB H里面的 main init 开始的 里面包括了内核的初始化 堆
  • 【更新指南】BarTender正式迎来2019 R2重大版本更新!

    BarTender 在 150 多个国家 地区拥有成千上百的用户 在标签 条形码 证卡和 RFID 标记的设计和打印领域是全球首屈一指的软件 BarTender 既可以单独运行 也可以与任何其他程序集成 几乎是所有按需打印或打标应用的完美解
  • 国泰安下载数据太大?stata传不进来?

    除了换电脑还有啥方法 其实就是一个小的tip 善用国泰安的条件筛选功能 只愿大家可以从下面的小例子中获取点扩展思维 例如最常用的财务报表数据 国泰安默认的是季度数据 但大多数时候我们需要的只是年度数据 那么我们就可以在条件筛选处加一个 不要
  • 【Android】点击应用进而打开base.apk的调用流程再分析

    点击一个应用的时候 会加载其对应的base apk 我们在AssetManager类的addAssetPath方法中添加堆栈打印 其调用堆栈为 android content res AssetManager addAssetPath As
  • 性能测试 —— Jmeter 常用重要函数汇总

    1 counter 计数器 加1的功能 疑问 假如加2 使用计数器 计数器超过最大值后重新开始计数 重点 最大值 如果运行结果超过最大值时 又会从起始值开始循环每个 用户独立计数器 多线程时 每个用户都是从起始值开始计数 跟线程号有关 th
  • Android 工程师需要了解的 Lint 知识入门篇

    前言 项目开发过程中 通过对代码规范的约束对于代码质量的提升是非常重要的 这其中除了人为的代码审查之外 我们还可以使用 lint 工具来定位并修改一些有问题的代码 帮助提高我们的代码规范程度 今天我们就一起来学学 lint 的使用 自动提示