详解Android Lint的原理及其使用

Android Lint 原理及使用详解



Android Lint 是 ADT 16中引入的新工具,用于扫描 Android 项目源中的潜在错误。

Lint 是 Android 提供的一个强大的,用于静态扫描应用源码并找出其中的潜在问题的实用工具。lint 工具可以检查你的 Android 项目源文件是否有潜在的错误,以及在正确性、安全性、性能、易用性、无障碍性和国际化方面是否需要优化改进。

Lint 既可以用作命令行工具,也可以与 Eclipse 和 IntelliJ 集成在一起。它被设计成独立于 IDE 的工具,我们可以在 Android Studio 中非常方便的使用它。

Lint 的工作过程

lint 工具的代码扫描工作流:

  • 应用源文件:源文件包含组成 Android 项目的文件,包括 Java、Kotlin 和 XML 文件、图标以及 ProGuard 配置文件。
  • lint.xml 文件:一个配置文件,可用于指定要排除的任何 lint 检查以及自定义问题严重级别。lint 工具:一个静态代码扫描工具,你可以从命令行或在 Android Studio 中对 Android 项目运行该工具。
  • lint 工具检查可能会影响 Android 应用的质量和性能的代码结构问题。强烈建议你先更正 lint 检测到的所有错误,然后再发布你的应用。
  • lint 检查结果:我们可以在控制台或 Android Studio 的 Inspection Results 窗口中查看 lint 检查结果。

Lint 的工作过程由 Lint Tool(检测工具),Source Files(项目源文件) 和 lint.xml(配置文件) 三个部分组成,Lint Tool 读取 Source Files,根据 lint.xml 配置的规则(issue)输出最终的结果。

Lint 的功能

Lint 可以检查并发现以下几类问题:

  • 缺少翻译(和未使用的翻译)
  • 布局性能问题(所有以前实用 layoutopt 工具用来查找的问题,等等)
  • 数组大小不一致
  • 可访问性和国际化问题(硬编码字符串,缺少 contentDescription 等)
  • 图标问题(例如缺少密度,重复的图标,错误的尺寸等)
  • 可用性问题(如未在文本字段中指定输入类型)
  • Manifest 错误

问题等级

Lint 发现的每个问题都有描述信息和等级,我们可以很方便地定位问题,同时按照严重程度进行解决。当然,我们也可以手动配置每个问题的严重级别。Lint 本身包含大量已经封装好的接口,能提供丰富的代码信息,开发者可以基于这些信息进行自定义规则的编写。

Lint 会按照问题的严重程度分为几个等级:

  • Fatal
  • Error
  • Warning
  • Information
  • Ignore

问题严重程序由高到低依次降低。

从命令行运行 lint

如果你使用的是 Android Studio 或 Gradle,你可以在项目的根目录下输入以下某个命令,使用 Gradle 封装容器对项目调用 lint 任务:

在 Windows 上:

gradlew lint

在 Linux 或 Mac 上:

./gradlew lint

lint 工具完成其检查后,会提供 XML 和 HTML 版 lint 报告的路径。然后,我们可以转到 HTML 报告并在浏览器中将其打开

Android Studio 中使用 Lint

Lint 已经被集成到 Android Studio,所以可以直接使用,使用非常方便。lint 的代码扫描工具,可帮助你发现并更正代码结构质量的问题,而无需您实际执行应用,也不必编写测试用例。系统会报告该工具检测到的每个问题并提供问题的描述消息和严重级别,以便你可以快速确定需要优先进行的关键改进。此外,你还可以降低问题的严重级别以忽略与项目无关的问题,或者提高严重级别以突出特定问题。

从菜单栏,选择Analyze > Inspect Code

选择检查范围

选择后,点击"OK",稍等一会就会生成扫描结果:

左侧是问题分类,选中一个问题条目,则右侧会展示具体的问题代码,这样就可以很方便的进行问题排查、定位和更改了。

Android 的规则类别:

  • Accessibility 辅助选项,例如 ImageView 缺少 contentDescription 描述,String 编码字符串等问题。
  • Compliance 合规性,违反了Google Play的要求,比如使用了过期的库版本,性能、安全性、API等级等没有遵循新系统的要求等。
  • Correctness 不够完美的编码,比如硬编码、使用过时API等。
  • Internationalization 国际化,如直接使用汉字,没有使用资源引用等。
  • Interoperability 互操作性,比如和Kotln的交互等。
  • Performance 性能,例如:静态引用,循环引用等。
  • Security 安全性,例如没有使用 HTTPS 连接 Gradle,AndroidManifest 中的权限问题等。
  • Usability 易用性,有更好的替换的,例如缺少某些倍数的切图,排版、图标格式建议.png格式等等。

lint 配置

配置 lint 文件

我们可以在 lint.xml 文件中进行 lint 配置。我们可以手动创建该文件,并放置在 Android 项目的根目录下。

lint.xml 文件由封闭的 父标记组成,此标记包含一个或多个 子元素。lint 会为每个 定义唯一的 id 属性值。

<?xml version="1.0" encoding="UTF-8"?>
<lint>
        <!-- list of issues to configure -->
</lint>

我们可以通过在 标记中设置严重性级别属性来更改某个问题的严重性级别或对该问题停用 lint 检查。

下面来看一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <!-- Disable the given check in this project -->
    <issue id="IconMissingDensityFolder" severity="ignore" />

    <!-- Ignore the ObsoleteLayoutParam issue in the specified files -->
    <issue id="ObsoleteLayoutParam">
        <ignore path="res/layout/activation.xml" />
        <ignore path="res/layout-xlarge/activation.xml" />
    </issue>

    <!-- Ignore the UselessLeaf issue in the specified file -->
    <issue id="UselessLeaf">
        <ignore path="res/layout/main.xml" />
    </issue>

    <!-- Change the severity of hardcoded strings to "error" -->
    <issue id="HardcodedText" severity="error" />
</lint>

禁用某个文件或方法进行 lint 检查

如果我们在 Android 项目中想对某个类或方法禁用 lint 检查,可以请向该代码添加 @SuppressLint 注解。

以下示例展示了如何对 onCreate 方法中的 NewApi 问题停用 lint 检查。lint 工具会继续检查该类的其他方法中的 NewApi 问题。

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

以下示例展示了如何对 FeedProvider 类中的 ParserError 问题停用 lint 检查:

@SuppressLint("ParserError")
public class FeedProvider extends ContentProvider {

要禁止 lint 检查文件中的所有问题,请使用 all 关键字,如下所示:

@SuppressLint("all")

xml 文件的 lint 检测配置

我们可以使用 tools:ignore 属性对 XML 文件的特定部分停用 lint 检查。在 lint.xml 文件中添加以下命名空间值,以便 lint 工具能够识别该属性:

namespace xmlns:tools="http://schemas.android.com/tools"

以下示例展示了如何对 XML 布局文件的 元素中的 UnusedResources 问题停用 lint 检查。如果某个父元素声明了 ignore 属性,则该元素的子元素会继承此属性。在本示例中,也会对 子元素停用 lint 检查。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="UnusedResources" >

    <TextView
        android:text="@string/auto_update_prompt" />
</LinearLayout>

要禁止检查多个问题,请使用以英文逗号分隔的字符串列出要禁止检查的问题。例如:

tools:ignore="NewApi,StringFormatInvalid"

要禁止 lint 检查 XML 元素中的所有问题,请使用 all 关键字,如下所示:

tools:ignore="all"

通过 Gradle 配置 lint 选项

通过 Android Plugin for Gradle,我们可以使用模块级 build.gradle 文件中的 lintOptions {} 代码块配置某些 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.
    check '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 true, only report errors.
    ignoreWarnings true
  }
}
...

在 Android Studio 中修改 lint 配置文件

我们可以很方便的在 Android Studio 中修改 lint 检查时的配置。

Android Studio 附带了许多 lint 及其他检查配置文件,这些配置文件可通过 Android 更新进行更新。我们可以原封不动地使用这些配置文件,也可以修改它们的名称、说明、严重级别和范围。当然,还可以激活和禁用整组的配置文件或一组配置文件中的个别配置文件。

依次选择 Analyze > Inspect Code,在 Specify Scope 对话框的 Inspection Profile 下,点击 More。

此时将显示 Inspections 对话框,其中列出了支持的检查及其说明:

  1. 选择 Profile 下拉列表,以在 Default (Android Studio) 与 Project Default(活动项目)检查之间切换。
  2. 在左侧窗格的 Inspections 对话框中,选择一个顶级配置文件类别,或展开一个组并选择特定的配置文件。选择一个配置文件类别后,我们可以将该类别中的所有检查项目当作一个检查项目进行修改。
  3. 选择 Manage 下拉列表,以复制检查项目、对检查项目进行重命名、向检查项目添加说明以及导出/导入检查项目。
  4. 操作完成后,点击 OK。

以上就是详解Android Lint的原理及其使用的详细内容,更多关于Android Lint的原理的资料请关注我们其它相关文章!

(0)

相关推荐

  • Vue-cli Eslint在vscode里代码自动格式化的方法

    编辑器另外一个很重要的功能就是代码格式化了,VS Code默认提供常见文件的格式化,如.js,.html等. 添加对.vue文件的格式化支持 这里我们添加对 .vue 文件的格式化支持. 1. 安装 Vetur 插件 2. 在 VS Code 的设置中添加如下规则: { "vetur.format.defaultFormatter": { "html": "prettier", "css": "prettier&qu

  • webpack引入eslint配置详解

    webpack中eslint使用 首先,要使webpack支持eslint,就要要安装 eslint-loader ,命令如下: npm install --save-dev eslint-loader 在 webpack.config.js 中添加如下代码: { test: /\.js$/, loader: 'eslint-loader', enforce: "pre", include: [path.resolve(__dirname, 'src')], // 指定检查的目录 op

  • Android——Android lint工具项目资源清理详解

    Android--Android lint工具项目资源清理 最近维护的项目已经有两年多,经过很多前辈的迭代,项目并没有变得健壮,而变得很臃肿.用Android lint工具清理了一次,清楚了不少废弃的布局和资源. 1.     Android lint工具 可以右键项目,Android tools,退出的时候clear lint markers即可 也可以如图: 2.结果出来了,分析分析 3.xml中view太多,已经超过了80个,影响性能. 布局优化: 尽量使用include.merge.Vi

  • Android TraceView和Lint使用详解及性能优化

    Android lint工具是Android studio中集成的一个代码提示工具,它主要负责对你的代码进行优化提示,包括xml和java文件,很强大.编写完代码及时进行lint测试,会让我们的代码变得非常规范而且避免代码冗余.让我们及时发现代码中隐藏的问题. lint的使用时非常简单的,我看可以用它实现代码布局的优化,Java代码的优化,不过我觉得根本解决问题还是得依赖于开发者的素质. 例子:我们需要删除掉一些无用的变量和布局文件等,这对代码的冗余有很大的帮助. 代码提示我们在6行需要为Ima

  • 详解Android Lint的原理及其使用

    Android Lint 原理及使用详解 Android Lint 是 ADT 16中引入的新工具,用于扫描 Android 项目源中的潜在错误. Lint 是 Android 提供的一个强大的,用于静态扫描应用源码并找出其中的潜在问题的实用工具.lint 工具可以检查你的 Android 项目源文件是否有潜在的错误,以及在正确性.安全性.性能.易用性.无障碍性和国际化方面是否需要优化改进. Lint 既可以用作命令行工具,也可以与 Eclipse 和 IntelliJ 集成在一起.它被设计成独

  • 详解Android中Handler的内部实现原理

    本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文<详解Android中Handler的使用方法>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功

  • 详解Android JetPack之LiveData的工作原理

    前言 本篇文章主要讲解LiveData工作的原理,如果还不知道LiveData如何用的话,请参考官方文档. LiveData的讲解涉及到了Lifecycle的知识,如果你还不了解LifeCycle,请参考文档LifeCycle介绍. 介绍 LiveData是一个数据持有类,它可以通过添加观察者被其他组件观察其变更.不同于普通的观察者,它最重要的特性就是遵从应用程序的生命周期,如在Activity中如果数据更新了但Activity已经是destroy状态,LivaeData就不会通知Activit

  • 详解Android.activity销毁流程的工作原理

    继续我们的源码解析,上一篇文章我们介绍了Activity的启动流程,一个典型的场景就是Activity a 启动了一个Activity b,他们的生命周期回调方法是: onPause(a) –> onCreate(b) –> onStart(b) –> onResume(b) –> onStop(a) 而我们根据源码也验证了这样的生命周期调用序列,那么Activity的销毁流程呢?它的生命周期的调用顺序又是这样的呢? 这里我们我做一个简单的demo,让一个Activity a启动A

  • 详解Android中图片的三级缓存及实例

    详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

  • 详解Android ViewCompat的作用

    详解Android ViewCompat的作用 ViewCompat类主要是用来提供兼容性的, 比如我最近看的比较的多的canScrollVertically方法, 在ViewCompat里面针对几个版本有不同的实现, 原理上还是根据版本判断, 有时甚至还要判断传入参数的类型. 但是要注意的是, ViewCompat仅仅让你调用不崩溃, 并不保证你调用的结果在不同版本的机器上一致. 关于如何优雅的组织代码, ViewCompat类的结构非常适合我们参考. ViewCompat里面定义了一个接口,

  • 详解Android Bitmap的常用压缩方式

    一.前言 已经好久没有更新博客,大概有半年了,主要是博主这段时间忙于找工作,Android岗位的工作真的是越来越难找,好不容易在广州找到一家,主要做海外产品,公司研发实力也不错,所以就敲定了三方协议.现在已经在公司实习了一个月多,目前主要是负责公司某个产品的内存优化,刚好就总结了一下Android Bitmap常用的优化方式. Android中的图片是以Bitmap方式存在的,绘制的时候也是Bitmap,直接影响到app运行时的内存,在Android,Bitmap所占用的内存计算公式是:图片长度

  • 详解Android aidl的使用方法

    AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写(对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互.) AIDL只是Android中众多进程间通讯方式中的一种方式, AIDL和Messenger的区别: Messenger不适用大量并发的请求:Messenger以串行的方式来处

  • 详解Android 消息处理机制

    摘要 Android应用程序是通过消息来驱动的,当Android主线程启动时就会在内部创建一个消息队列.然后进入一个无限循环中,轮询是否有新的消息需要处理.如果有新消息就处理新消息.如果没有消息,就进入阻塞状态,直到消息循环被唤醒. 那么在Android系统中,消息处理机制是怎么实现的呢?在程序开发时,我们经常会使用Handler处理Message(消息).所以可以知道Handler是个消息处理者,Message是消息主体.除此之外还有消息队列和消息轮询两个角色.它们分别是MessageQueu

  • 详解Android Bitmap的使用

    一 图片表示原理 图片是由每个像素点来组成 像素点就是小方块 图片的大小等于 宽*高*每个像素点的大小 二 加载图片OOM异常 解决办法 其中big.jpg是一张21.2MB的高清图 public class MainActivity extends AppCompatActivity implements View.OnClickListener { ImageView mImageView; @Override protected void onCreate(Bundle savedInst

随机推荐