当前位置: 首页 > news >正文

Android Lint

文章目录

  • Android Lint
    • 概述
    • 工作流程
    • Lint 问题
      • 问题种类
      • 警告严重性
      • 检查规则
    • 用命令运行 Lint
    • AndroidStudio 使用 Lint
    • 忽略 Lint 警告
    • gradle 配置 Lint
    • 查找无用资源文件

Android Lint

概述

Lint 是 Android 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案,而且这个过程不需要我们手写测试用例。

Lint 发现的每个问题都有描述信息和等级(和测试发现 bug 很相似),我们可以很方便地定位问题,同时按照严重程度进行解决。

官网

工作流程

Lint 会根据预先配置的检测标准检查我们 Android 项目的源文件,发现潜在的 bug 或者可以优化的地方。

在这里插入图片描述

Lint 问题

问题种类

  • Correctness:编码质量问题,可能包括硬编码的字符串、使用过时的API、无效的注释、废弃的代码路径等。
  • Security: 安全性问题,例如使用不安全的网络连接、在代码中泄露敏感信息、AndroidManifest 中的权限问题等。
  • Performance:性能相关的问题,例如无效的布局层次结构、不必要的资源加载、内存泄漏、过度使用静态变量、循环引用等。
  • Usability:易用性问题,比如缺少某些倍数的图像资源、布局方向依赖性、触摸目标大小不合理等。
  • Accessibility:辅助功能问题,比如 ImageView 缺少 contentDescription、不正确的视图聚焦顺序、文本大小或颜色对比度不足等。
  • Internationalization:国际化问题,如直接在代码中使用非英文字符而不是使用资源文件中的字符串、硬编码的日期和时间格式等。
  • Spelling:拼写错误问题,在代码或资源文件中的拼写问题。

警告严重性

  • Fatal:最严重错误,可能导致编译失败或应用崩溃,这些问题必须立即解决,否则项目无法构建。
  • Error:错误,可能导致应用行为不正确或不稳定。强烈建议修复这些错误,以保证应用的可靠性和稳定性。
  • Warning:警告,虽然可能不会阻止应用运行,但它们可能会影响应用的性能、安全性或用户体验。开发者应该评估这些警告,并考虑是否需要修复。
  • Info:信息提示,通常用于指出一些可能的改进点,或者是一些可能需要开发者注意但不一定需要立即修复的事项。
  • Typo,拼写错误。
  • Unused Entry:未使用的属性。

检查规则

Android Lint 支持大量的检查规则,每个规则都有一个唯一的ID。由于规则数量众多且不断更新,这里无法提供一个详尽无遗的列表,但我可以列举一些常见的Lint检查ID及其简要说明,帮助你理解它们的用途:

TypographyFractions: 检查分数显示方式是否正确。
TypographyQuotes: 检查引号使用是否一致。
UnusedResources: 检查是否存在未使用的资源。
deprecated-api: 检查是否使用了已弃用的 API。
EqualsHashCode: 检查类是否正确地实现了 equals() 和 hashCode() 方法。
MagicNumber: 检查是否有魔数(硬编码的数字)。
ArraySizeZero: 检查数组大小是否为零。
EmptyCatchBlock: 检查空的 catch 块。
ProguardRules: 检查 ProGuard 配置文件中的规则。
LayoutInflation: 检查布局文件中的视图引用是否正确。
UnusedResources - 检查项目中未使用的资源文件,包括图片、布局、字符串等。
ExtraTranslation - 检查是否有未在代码中使用的翻译字符串资源。
IconMissingDensityFolder - 警告图标缺失特定密度的文件夹,比如hdpi、xhdpi等。
MissingDefaultResource - 当资源引用了默认值但未提供时触发。
UnusedAttribute - 在XML布局文件中检测未使用的属性。
InefficientWeight - 布局中使用LinearLayout权重可能导致性能问题的警告。
HardcodedText - 查找代码中直接硬编码的文本,建议使用字符串资源。
Deprecated - 使用了已废弃的API或方法。
NewerVersionAvailable - 当使用了较旧的支持库版本时提醒有新版本可用。
SwitchIntDef - 当Switch语句没有覆盖所有@IntDef的情况发出警告。
GradleDependency - 检查依赖是否使用了正确的版本或指出潜在的依赖冲突。
SecurityDetector - 包含多种安全相关的检查,如不安全的网络请求、文件权限等。
ExportedReceiver - 未明确指定exported属性的BroadcastReceiver可能被外部应用调用。
AllowBackup - 应用是否允许备份,可能会导致敏感数据泄露。
PermissionLeak - 检测Activity、Service等组件注册后未注销可能导致的权限泄露。

可以点击:工具栏 -> Analyze -> Inspect Code -> Inspections 中查看所有规则。

用命令运行 Lint

  • 在 Windows 上:

    gradlew lint
    
  • 在 Linux 或 macOS 上:

    ./gradlew lint
    
指定模块
gradlew :app:lint

最终会在 build/reports 目录下生成 lint-results.html 等报告。

AndroidStudio 使用 Lint

一、点击:工具栏 -> Analyze -> Inspect Code… :

在这里插入图片描述

二、弹出对话框,选择扫描的作用域:

在这里插入图片描述

三、点击 Custom scope 自定义范围,弹出对话框:

  • Local:在当前项目中使用。
  • Shared:其他项目也可以使用。

在这里插入图片描述

四、 选择Shared,并取名为“MyShared”,显示如下:

在这里插入图片描述

右边4个按钮含义:

  • Include:包含当前文件夹内的文件,但不包含子文件夹。
  • Include Recursively:递归添加,包含当前文件夹和子文件夹内所有文件。
  • Exclude:移除当前文件夹,当不包含子文件夹。
  • Exclude Recursively:移除当前文件夹和子文件夹。

五、 点击“app”,并点击右边“Include Recursively”:

在这里插入图片描述

app目录颜色变绿,并提示有36个文件夹190个文件要扫码。

六、点击确定,开始扫码:

扫码结果如下:

在这里插入图片描述

切换视图:

在这里插入图片描述

详细问题:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

忽略 Lint 警告

代码忽略警告:

@SuppressWarnings@SuppressLint 都是用来抑制代码中特定警告的注解,@SuppressWarnings 主要针对Java编译器警告,而 @SuppressLint 特定于Android Lint工具的警告。

public class MyHandler extends Handler {// 忽略内存泄露风险@SuppressLint("StaticFieldLeak")private static Activity activity;public MyHandler(Activity activity) {this.activity = activity;}
}
// 忽略新API警告
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
}
// 直接忽略
@SuppressLint("all")

XML忽略警告:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:ignore="all"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@color/white">

gradle 配置 Lint

  1. abortOnError:
    • 类型: Boolean
    • 默认值: false
    • 说明: 当设置为true时,如果Lint发现任何错误,Gradle构建将会终止。如果为false,即使发现错误构建也会继续。
  2. ignoreWarnings:
    • 类型: Boolean
    • 默认值: false
    • 说明: 如果设为true,Lint将忽略所有的警告级别问题,只报告错误级别的问题。这对于只想关注严重问题的场景很有用。
  3. quiet:
    • 类型: Boolean
    • 默认值: false
    • 说明: 当设为true时,Lint不会输出分析进度信息到控制台,使得输出更加简洁,仅显示最终的报告或错误信息。
  4. checkReleaseBuilds:
    • 类型: Boolean
    • 默认值: true
    • 说明: 控制是否在release构建时运行Lint检查。设为false可以跳过发布构建的Lint检查,加快构建速度。
  5. warningsAsErrors:
    • 类型: Boolean
    • 默认值: false
    • 说明: 如果设置为true,则所有警告都将被视为错误处理,这会影响abortOnError的行为。
  6. checkAllWarnings:
    • 类型: Boolean
    • 默认值: true
    • 说明: 当设为false时,可以关闭某些非默认启用的警告检查,但通常建议保持为true以获取完整的检查覆盖。
  7. disable:
    • 类型: List<String>
    • 说明: 指定要禁用的特定Lint检查的ID列表。这允许你排除不关心或经常产生误报的检查。
  8. enable:
    • 类型: List
    • 说明: 指定要特别启用的Lint检查的ID列表,即使这些检查在默认配置中是禁用的。
  9. baselineFile:
    • 类型: File
    • 说明: 指定一个XML文件作为基线,只报告比基线中新增的问题。这有助于持续改进代码质量,而不需要立即解决历史问题。
  10. textReport:
    • 类型: Boolean
    • 默认值: false
    • 说明: 设置为true会在构建目录下生成文本形式的Lint报告。
  11. htmlReport:
    • 类型: Boolean
    • 默认值: false
    • 说明: 开启后会在构建目录生成HTML格式的Lint报告,便于浏览和分享。
android {lintOptions {// Turns off checks for the issue IDs you specify.disable 'TypographyFractions','TypographyQuotes'// Turns on checks for the issue IDs you specify. These checks are in// addition to the default lint checks.enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'// To enable checks for only a subset of issue IDs and ignore all others,// list the issue IDs with the 'check' property instead. This property overrides// any issue IDs you enable or disable using the properties above.checkOnly 'NewApi', 'InlinedApi'// If set to true, turns off analysis progress reporting by lint.quiet true// If set to true (default), stops the build if errors are found.abortOnError false// If set to true, lint only reports errors.ignoreWarnings true// If set to true, lint also checks all dependencies as part of its analysis.// Recommended for projects consisting of an app with library dependencies.checkDependencies true}
}

查找无用资源文件

点击:工具栏 -> Analyze -> Run Inspection By Name :

在这里插入图片描述

扫描出很多无用文件:

在这里插入图片描述

可以点击右边按钮“Remove All Unused Resources”删除。

相关文章:

Android Lint

文章目录 Android Lint概述工作流程Lint 问题问题种类警告严重性检查规则 用命令运行 LintAndroidStudio 使用 Lint忽略 Lint 警告gradle 配置 Lint查找无用资源文件 Android Lint 概述 Lint 是 Android 提供的 代码扫描分析工具&#xff0c;它可以帮助我们发现代码结构/质量…...

【算法刷题 | 动态规划14】6.28(最大子数组和、判断子序列、不同的子序列)

文章目录 35.最大子数组和35.1题目35.2解法&#xff1a;动规35.2.1动规思路35.2.2代码实现 36.判断子序列36.1题目36.2解法&#xff1a;动规36.2.1动规思路36.2.2代码实现 37.不同的子序列37.1题目37.2解法&#xff1a;动规37.2.1动规思路37.2.2代码实现 35.最大子数组和 35.1…...

vue3 vxe-grid列中绑定vxe-switch实现数据更新

1、先上一张图&#xff1a; <template #valueSlot"{ row }"><vxe-switch :value"getV(row.svalue)" change"changeSwitch(row)" /></template>function getV(value){return value 1;};function changeSwitch(row) {console.l…...

Hive SQL:实现炸列(列转行)以及逆操作(行转列)

目录 列转行行转列 列转行 函数&#xff1a; EXPLODE(ARRAY)&#xff1a;将ARRAY中的每一元素转换为每一行 EXPLODE(MAP)&#xff1a;将MAP中的每个键值对转换为两行&#xff0c;其中一行数据包含键&#xff0c;另一行数据包含值 数据样例&#xff1a; 1、将每天的课程&#…...

MD5算法详解

哈希函数 是一种将任意输入长度转变为固定输出长度的函数。 一些常见哈希函数有&#xff1a;MD5、SHA1、SHA256。 MD5算法 MD5算法是一种消息摘要算法&#xff0c;用于消息认证。 数据存储方式&#xff1a;小段存储。 数据填充 首先对我们明文数据进行处理&#xff0c;使其…...

ES6的代理模式-Proxy

语法 target 要使用 Proxy 包装的目标对象&#xff08;可以是任何类型的对象&#xff0c;包括原生数组&#xff0c;函数&#xff0c;甚至另一个代理handler 一个通常以函数作为属性的对象&#xff0c;用来定制拦截行为 const proxy new Proxy(target, handle)举个例子 <s…...

排序(堆排序、快速排序、归并排序)-->深度剖析(二)

前言 前面介绍了冒泡排序、选择排序、插入排序、希尔排序&#xff0c;作为排序中经常用到了算法&#xff0c;还有堆排序、快速排序、归并排序 堆排序&#xff08;HeaSort&#xff09; 堆排序的概念 堆排序是一种有效的排序算法&#xff0c;它利用了完全二叉树的特性。在C语言…...

七一建党节|热烈庆祝中国共产党成立103周年!

时光荏苒&#xff0c;岁月如梭。 在这热情似火的夏日&#xff0c; 我们迎来了中国共产党成立103周年的重要时刻。 这是一个值得全体中华儿女共同铭记和庆祝的日子&#xff0c; 也是激励我们不断前进的重要时刻。 103年&#xff0c; 风雨兼程&#xff0c;砥砺前行。 从嘉兴…...

Spring Boot应用知识梳理

一.简介 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的工具。它简化了基于 Spring 的应用程序的配置和部署过程&#xff0c;提供了一种快速、便捷的方式来构建独立的、生产级别的 Spring 应用程序。 Spring Boot 的一些主要优点包括&#xff1a; 1. 简化配置…...

Spring中利用重载与静态分派

Spring中利用重载与静态分派 在Java和Spring框架中&#xff0c;重载&#xff08;Overloading&#xff09;和静态分派&#xff08;Static Dispatch&#xff09;是两个非常重要的概念&#xff0c;它们在处理类方法选择和执行过程中扮演着关键角色。本文旨在深入探讨Spring环境下…...

文本三剑客之awk:

文本三剑客awk&#xff1a; grep 查 sed 增删改查 主要&#xff1a;增改 awk 按行取列 awk awk默认的分隔符&#xff1a;空格&#xff0c;tab键&#xff0c;多个空格自动压缩为一个。 awk的工作原理&#xff1a;根据指令信息&#xff0c;逐行的读取文本内容&#xff0c;然…...

SpringSecurity-授权示例

用户基于权限进行授权 定义用户与权限 authorities()。 package com.cms.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.User; import…...

选哪个短剧系统源码好:全面评估与决策指南

在短剧内容创作和分享日益流行的今天&#xff0c;选择合适的短剧系统源码对于构建一个成功的短剧平台至关重要。短剧系统源码不仅关系到平台的稳定性和用户体验&#xff0c;还直接影响到内容创作者和观众的互动质量。本文将提供一份全面的评估指南&#xff0c;帮助您在众多短剧…...

AI时代的软件工程:挑战与改变

人工智能&#xff08;AI&#xff09;正以惊人的速度改变着我们的生活和工作方式。作为与AI关系最为密切的领域之一&#xff0c;软件工程正经历着深刻的转变。 1 软件工程的演变 软件工程的起源 软件工程&#xff08;Software Engineering&#xff09;是关于如何系统化、规范化地…...

Zuul介绍

Zuul 是 Netflix 开源的一个云平台网络层代理&#xff0c;它主要用于路由、负载均衡、中间件通信和动态路由。Zuul 本质上是一个基于 JVM 的网关&#xff0c;它提供了以下功能&#xff1a; 1.路由&#xff1a;Zuul 允许客户端和服务器之间的所有入站和出站请求通过一个中心化的…...

7-1作业

1.实验目的&#xff1a;完成字符收发 led.h #ifndef __GPIO_H__ #define __GPIO_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC,GPIO,UART初始化 void init();//字符数据发送 void set_tt…...

ElasticSearch安装、配置详细步骤

一、环境及版本介绍 操作系统&#xff1a; Windows 10 软件版本&#xff1a; elasticsearch-7.17.22、kibana-7.17.22、IK-7.17.22 开发环境选择软件版本应提前考虑正式系统环境&#xff0c;否则会产生软件与服务器环境不兼容的问题出现&#xff0c;ElasticSearch与环境支持…...

【Mybatis 与 Spring】事务相关汇总

之前分享的几篇文章可以一起看&#xff0c;形成一个体系 【Mybatis】一级缓存与二级缓存源码分析与自定义二级缓存 【Spring】Spring事务相关源码分析 【Mybatis】Mybatis数据源与事务源码分析 Spring与Mybaitis融合 SpringManagedTransaction&#xff1a; org.mybatis.spri…...

Leetcode 2065. 最大化一张图中的路径价值(DFS / 最短路)

Leetcode 2065. 最大化一张图中的路径价值 暴力DFS 容易想到&#xff0c;从0点出发DFS&#xff0c;期间维护已经走过的距离&#xff08;时间&#xff09;和途径点的权值之和&#xff0c;若访问到0点则更新答案&#xff0c;若下一步的距离与已走过的距离和超出了maxTime&#…...

SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution

CVPR2024 香港理工大学&OPPO&bytedancehttps://github.com/cswry/SeeSR?tabreadme-ov-file#-licensehttps://arxiv.org/pdf/2311.16518#page5.80 问题引入 因为有些LR退化情况比较严重&#xff0c;所以超分之后的结果会出现语义的不一致的情况&#xff0c;所以本文训…...

不用pip也能装!3种方法在Pycharm中配置wxPython(含离线安装技巧)

突破网络限制&#xff1a;PyCharm中wxPython的3种高阶安装方案 在企业开发环境中&#xff0c;网络访问限制常常成为Python包管理的"拦路虎"。特别是像wxPython这样包含二进制扩展的GUI库&#xff0c;传统pip安装方式在离线环境下几乎束手无策。本文将揭秘三种无需依赖…...

7天玩转Open-LLM-VTuber:从零基础到打造专属AI虚拟主播

7天玩转Open-LLM-VTuber&#xff1a;从零基础到打造专属AI虚拟主播 【免费下载链接】Open-LLM-VTuber Talk to LLM by voice with Live2D that runs offline on multiple platforms. An attempt to build AI VTuber neuro-sama. 项目地址: https://gitcode.com/gh_mirrors/op…...

利用AI写教材,掌握低查重方法,让你的教材脱颖而出!

许多教材编写者常常会有一种失落感&#xff1a;在花费大量心血完成了主体内容后&#xff0c;配套资源的不足却影响了整体的教学效果。针对课后练习的题型设计&#xff0c;常常缺乏创新的思路&#xff1b;想要制作直观的教学课件&#xff0c;却没有相应的技术能力&#xff1b;对…...

基于粒子群优化算法PSO的宽带消色差超透镜设计与MATLAB核心程序实现FDTD仿真分析

基于粒子群算法PSO的宽带消色差超透镜 matlab核心程序 FDTD仿真最近在折腾超透镜设计时被宽带消色差问题整得够呛。传统设计方法面对多波长相位调控时总有点力不从心&#xff0c;直到尝试用粒子群算法&#xff08;PSO&#xff09;配合FDTD仿真&#xff0c;事情突然有了转机。今…...

如何快速上手BepInEx:3个高效秘诀解锁Unity游戏插件开发

如何快速上手BepInEx&#xff1a;3个高效秘诀解锁Unity游戏插件开发 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想象一下&#xff0c;你心爱的Unity游戏缺少某个功能&#xff…...

具身智能“标准线”划定,行业分化加剧?

近期具身智能行业有两件大事&#xff0c;宇树科技计划 IPO&#xff0c;首个行业标准发布。这两条“标准线”的确立&#xff0c;或使品牌和投融资市场迎来马太效应&#xff0c;推动行业分化。标准确立&#xff0c;行业分化开端具身智能行业的两件大事看似关联不大&#xff0c;实…...

2026秋招必备!大模型面试八股文精华(小白程序员必收藏)

本文整理了备战2026秋招时所需的大模型面试核心问题&#xff0c;涵盖LLM/VLM理论、RAG/Agent开发、RLHF对齐技术及模型评估等全链路知识。内容基于多次真实面试经历&#xff0c;建议读者先独立思考再对照答案&#xff0c;达到知其然更知其所以然的学习效果。预祝求职顺利&#…...

中国铁路 12306|基于springboot + vue中国铁路 12306购票管理系统(源码+数据库+文档)

中国铁路 12306购票管理系统 目录 基于springboot vue中国铁路 12306购票管理系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue中…...

QT实战:用QChartView快速打造动态折线图(附完整代码)

QT实战&#xff1a;用QChartView快速打造动态折线图&#xff08;附完整代码&#xff09; 在数据可视化领域&#xff0c;动态折线图因其直观展示数据变化趋势的能力&#xff0c;成为监控系统、金融分析、工业控制等场景的标配。QT框架提供的QChartView组件&#xff0c;让开发者能…...

3大维度解析BGE向量技术:从原理到检索增强实践

3大维度解析BGE向量技术&#xff1a;从原理到检索增强实践 【免费下载链接】FlagEmbedding Dense Retrieval and Retrieval-augmented LLMs 项目地址: https://gitcode.com/GitHub_Trending/fl/FlagEmbedding 文本嵌入技术是现代AI系统的核心组件&#xff0c;而检索增强…...