作用:发现代码质量问题
android{
lintOptions{
// 相关配置
}
}
我们知道 gradle 的配置都会映射到一个java类,全局搜索LintOptions,我们发现com.android.build.gradle.internal.dsl
包下有一个LintOptions.java
文件,这个就是我们映射的Java类
1. 检测方式
-
通过命令行检测:
# 可以追加变体,比如 app:lintRelease 和 app:lintDebug gradlew app:lint
-
手动检测(推荐)
在菜单栏中依次选择Code > Inspect Code,查看检测范围和配置文件,点击ok运行检查
查看检测结果
2. 配置文件
如果希望可以忽略一些检测项或调整其严重等级,可以通过修改配置文件lint.xml
方式,lint的工作方式如下图
可以手动创建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自带的默认配置文件
3. 属性
-
abortOnError:发现错误,停止构建
lintOptions{ abortOnError false // 关闭该判断(默认开启),不建议这么做 }
-
absolutePaths:报告文档是否输出全路径,默认相对路径
lintOptions{ absolutePaths false }
生效对象包括build 中输出的蓝色定位URL
-
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">
- [Accessibility] Missing contentDescription attribute on image
【原因】ImageView 中出现的提示,关注视力障碍人士
【方案】添加contentDescription属性 - This Handler class should be static or leaks might occur (anonymous android.os.Handler)
【原因】非静态内部类可能造成泄漏,外部类持有该引用无法释放
【方案】将非静态内部类修改为静态内部类,并使用弱引用持有Activity - Use new SparseIntArray(…) instead for better performance
【原因】SparceArray<Integer,Object>效率要高于HashMap,提高内存效率
【方案】使用该类取代传统的HashMap,还有SparseBooleanArray<Integer,Boolean>等形式 - Field can be converted to a local variable
【原因】字段转成成局部变量,因为局部变量是栈中
【方案】成员变量转成局部变量 - the resource ‘R.color.aqua’ appears to be unused
【原因】检测到无效资源,没有调用
【方案】建议删除 - This Cursor should be freed up after use with #close()
【原因】Cursor使用完未释放
【方案】释放掉 - This can be replaced with a tag
【原因】如果FrameLayout是根布局,并且不提供北京或填充,它可以替换成 merge
【方案】使用 merge 替换这样的 FrameLayout - 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