【工具】lint检测工具


作用:发现代码质量问题

android{
    lintOptions{
        // 相关配置
    }
}

我们知道 gradle 的配置都会映射到一个java类,全局搜索LintOptions,我们发现com.android.build.gradle.internal.dsl包下有一个LintOptions.java文件,这个就是我们映射的Java类

1. 检测方式

  1. 通过命令行检测:

    # 可以追加变体,比如 app:lintRelease 和 app:lintDebug
    gradlew app:lint
    
  2. 手动检测(推荐)

    在菜单栏中依次选择Code > Inspect Code,查看检测范围和配置文件,点击ok运行检查

    img

    查看检测结果

    img

2. 配置文件

如果希望可以忽略一些检测项或调整其严重等级,可以通过修改配置文件lint.xml方式,lint的工作方式如下图

img

可以手动创建lint.xml文件到Android项目的根目录下,配置文件定义的id优先默认配置

<?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>

另外也可以通过Configure跳转到Androidstudio自带的默认配置文件

img

3. 属性

  1. abortOnError:发现错误,停止构建

    lintOptions{
        abortOnError false // 关闭该判断(默认开启),不建议这么做
    }
    
  2. absolutePaths:报告文档是否输出全路径,默认相对路径

    lintOptions{
        absolutePaths false 
    }
    

    生效对象包括build 中输出的蓝色定位URL

  3. check:设置只检查的类型

    可以进入sdk\tools\bin\下执行lint --list查看所有支持的检测项,也可以通过lint --show <id>命令长某一检测项的详细介绍

    lintOptions{
       check 'UnsuedResource'// 只检查未使用资源 
    }
    

其它属性可以参考官网按需查看

4. 常见问题场景

首先我们需要知道,规则是死的,代码是活的,并非所有的Lint警告都需要通过修改代码来解决,有些警告可以被当成善意的提醒,我们可以通过一些标注来忽略它

如果是Java代码,我么可以通过@SuppressLint("警告名称")忽略

@SuppressLint(HandlerLeak)
@SuppressLint(“all”)  //如果不清楚警告名称,可以直接忽略all

如果是xml文件,可以通过tools:ignore="警告名称"忽略

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="TextFields,HardcodedText,UselessParent">
<!--如果不清楚警告名称,可以直接忽略all --> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="all">
  1. [Accessibility] Missing contentDescription attribute on image
    【原因】ImageView 中出现的提示,关注视力障碍人士
    【方案】添加contentDescription属性
  2. This Handler class should be static or leaks might occur (anonymous android.os.Handler)
    【原因】非静态内部类可能造成泄漏,外部类持有该引用无法释放
    【方案】将非静态内部类修改为静态内部类,并使用弱引用持有Activity
  3. Use new SparseIntArray(…) instead for better performance
    【原因】SparceArray<Integer,Object>效率要高于HashMap,提高内存效率
    【方案】使用该类取代传统的HashMap,还有SparseBooleanArray<Integer,Boolean>等形式
  4. Field can be converted to a local variable
    【原因】字段转成成局部变量,因为局部变量是栈中
    【方案】成员变量转成局部变量
  5. the resource ‘R.color.aqua’ appears to be unused
    【原因】检测到无效资源,没有调用
    【方案】建议删除
  6. This Cursor should be freed up after use with #close()
    【原因】Cursor使用完未释放
    【方案】释放掉
  7. This can be replaced with a tag
    【原因】如果FrameLayout是根布局,并且不提供北京或填充,它可以替换成 merge
    【方案】使用 merge 替换这样的 FrameLayout
  8. Consider using apply() instead; commit writes its data to persistent storage immediately, whereas apply will handle it in the background
    【原因】SharedPreferences的 commit写入数据时候是立刻写入,而apply是异步写入,前者在写入量较大情况下可能会存在主线程耗时的情况
    【方案】建议使用apply替换commit
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值