# Lint使用
Android Studio 提供一个名为 Lint 的代码扫描工具,可帮助您发现并纠正代码结构质量的问题,而无需实际执行该应用,也不必编写测试用例。该工具会报告其检测到的每个问题并提供该问题的描述消息和严重级别,以便您可以快速确定需要优先进行哪些关键改进。此外,您可以调低问题的严重级别,忽略与项目无关的问题,也可以调高严重级别,以突出特定问题。
Lint 工具可检查您的 Android 项目源文件是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进。
下面我们会对lint的使用、定制进行简单的介绍。
## 一、Lint使用
在使用 Android Studio 时,配置的 Lint 和 IDE 检查会在您每次构建应用时运行。不过,您可以手动运行检查或从命令行运行 Lint。 本段会对lint的多种执行方式进行简述。
### 1.1、实时执行
目前android studio中使用 IDEA的Inspections组件,他会对语法、拼写进行检查,Android Studio又在IDEA的Inspection基础上实现了Lint的实时检测功能。
在Android Studio中写代码时,Inspections会实时执行,其中包括Android定义的Lint规则,并在代码中直接标为黄色警告或红色错误。还可以使用Andorid Studio的`Intentions`工具快速添加`SupressLint`或自动修复。
> Intentions的使用可参考 [http://www.paincker.com/android-studio-skill](http://www.paincker.com/android-studio-skill)
![android-lint-inspection](http://pactji2yy.bkt.clouddn.com/android-lint-inspection.png)
可在Android Studio的设置中配置代码实时检查时,要检查的项
1. Preference – Editor – Inspections:代码检查
2. 默认有Default和Project Default两套配置,作用范围分别是全局和当前工程
### 1.2、手动执行
在Android Studio中可从菜单`Analyze - Inspect Code`手动执行Inspections,可选择要检查代码的范围(Inspection Scope),以及要检查的问题(Inspection Profile)。执行完成后效果如图,可以双击结果定位有问题的代码
![android-lint-mau](http:pactji2yy.bkt.clouddn.com/android-lint-mau.png)
### 1.3、Gradle Task执行
Gradle中编译代码时,会以任务(Task)的形式组织每一步操作,Task之间可以存在依赖关系,执行一个Task前,会先执行它所依赖的Task。
Android的Gradle环境下,有下面几个常见的Task。
* assemble:Gradle内建的编译任务
* check:Gradle内建的检查任务
* test:Gradle内建的测试任务
* build:包含assemble、check、test
* lint:Android插件定义的Lint检查任务,被包含到check任务中
在命令行中可调用gradle执行Task,例如在命令行中调用`gradle lint`即可执行lint任务。对于某个具体的BuildType(例如Debug)和ProductFlavor(例如Huawei市场),还可以执行`gradle lintHuaweiDebug`只对这种Build版本做Lint检查。
Lint默认会把所有结果以XML和HTML格式,输出到`build/reports/lint-results-xxx`中,可以在此查看所有Lint问题,包括具体在哪一行,以及Lint问题对应的ID。
![android-lint-gradle-task](http://pactji2yy.bkt.clouddn.com/android-lint-gradle-task.png)
### 1.4、命令行
直接执行`lint`命令,可执行文件位于`<android-home>/tools/lint`(`<android-home>`即AndroidSDK所在目录)。结果也会输出到报表中。具体参数配置可以用`lint --help`查看
## 二、Lint配置
使用官方自带的lint检查时,目前可用的配置有两处:LintOptions和lint.xml。
总体可配置的项:可以简述为以下几种:
* 配置lint的报告
* 配置lint检查的具体项目
* 配置lint检测行为
为了方便后面的述说,这里先贴一下lint.xml和lintOption的简单示例。
LintOptions常用配置项:
```groovy
android {
lintOptions {
// 如果为 true,生成一个问题的纯文本报告(默认为false)
textReport true
// 配置写入输出结果的位置;它可以是一个文件或 “stdout”(标准输出)
textOutput 'stdout'
// 如果为真,会生成一个XML报告,以给Jenkins之类的使用
xmlReport false
// 用于写入报告的文件(如果不指定,默认为lint-results.xml)
xmlOutput file("lint-report.xml")
// 如果为真,会生成一个HTML报告(包括问题的解释,存在此问题的源码,等等)
htmlReport true
// 写入报告的路径,它是可选的(默认为构建目录下的 lint-results.html )
htmlOutput file("lint-report.html")
// 不检查给定的问题id
disable 'TypographyFractions','TypographyQuotes'
// 检查给定的问题 id
enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
// * 仅 * 检查给定的问题 id
check 'NewApi', 'InlinedApi'
// 如果为true,则在错误报告的输出中不包括源代码行
// 重置 lint 配置(使用默认的严重性等设置)。
lintConfig file("default-lint.xml")
// 设置为 true时lint将不报告分析的进度
quiet true
// 如果为 true,则当lint发现错误时停止 gradle构建
abortOnError false
// 如果为 true,则只报告错误
ignoreWarnings true
// 如果为 true,则当有错误时会显示文件的全路径或绝对路径 (默认情况下为true)
//absolutePaths true
// 如果为 true,则检查所有的问题,包括默认不检查问题
checkAllWarnings true
// 如果为 true,则将所有警告视为错误
warningsAsErrors true
noLines true
// 如果为 true,则对一个错误的问题显示它所在的所有地方,而不会截短列表,等等。
showAll true
// 设置为 true, 将使所有release 构建都以issus的严重性级别为fatal(severity=false)的设置来运行lint
// 并且,如果发现了致命(fatal)的问题,将会中止构建(由上面提到的 abortOnError 控制)
checkReleaseBuilds true
// 设置给定问题的严重级别(severity)为fatal (这意味着他们将会
// 在release构建的期间检查 (即使 lint 要检查的问题没有包含在代码中)
fatal 'NewApi', 'InlineApi'
// 设置给定问题的严重级别为error
error 'Wakelock', 'TextViewEdits'
// 设置给定问题的严重级别为warning
warning 'ResourceAsColor'
// 设置给定问题的严重级别(severity)为ignore (和不检查这个问题一样)
ignore 'TypographyQuotes'
}
}
```
更多关于lintOption的信息可以查看 [LintOption的官方说明](http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.LintOptions.html)
### 2.1、配置lint的报告
根据上面贴的示例可以看到:
`xmlReport`:lint检查完成后,是否输出xml形式的报告。
`xmlOutput file("lint-report.xml")`:用来配置报告输出到哪里;
后面的`textReport`、`textOutput`、`htmlReport`、`htmlOutput`功能类似,这里不再赘述。
### 2.2、配置lint检查的具体项目
在实际开发中,官方自带的一些Issue对我们来说,并没有那么必要,我们可以通过配置来决定lint过程中,哪些Issus启用,哪些Issus禁用。
这里主要用到以下几项来配置相关Issus的开关:
* `enable`:配置要检查的问题
* `disable`:指定不检查的问题
* `check`:指定所有要检查的问题,没有指定的都不检查
此外,官方内置Issue项目的警告级别,并不能总是符合实际开发的场景,我们可以通过以下几个项来重载 相应的警告级别。
* `error`:将相关Issue的级别设置为Error
* `warning`:将相关Issue的级别设置为 warning
* `ignore`:将相关Issue的级别设置为 忽略
* `fatal`:设置相关Issue的严重级别(severity)为fatal (这意味着他们将会在release构建的期间检查 (即使 lint 要检查的问题没有包含在代码中)
### 2.3、配置lint检测行为
lintOption还可以配置检查的行为,
* `abortOnError`:现Error级别Lint问题时会中断编译
* `ignoreWarnings`:不检查Warning级别的Lint问题
* `warningsAsErrors`:对Warnning问题会和Error一样处理
* `checkReleaseBuilds`:Release时检查fatal级别的问题
除了在LintOption中配置外,还可以载入自定义的配置lint.xml:
`lintConfig`:用来告知编译器加载指定的lint.xml文件来覆盖默认的lint配置。
lint.xml示例:
```xml
<?xml version="1.0" encoding="utf-8" ?>
<lint>
<!--配置所有Issue的默认优先级-->
<issue id="all" severity="warning"/>
<!--配置指定Issue的优先级-->
<issue id="ShowToast" severity="error"/>
<!--忽略指定路径的指定问题,支持正则表达式或path匹配-->
<issue id="NewApi">
<ignore regexp=".*MainActivity.java"/>
<ignore path="**/com/demo/lint/MainActivity.java"/>
<ignore path="res/layout/activation.xml"/>
</issue>
</lint>
```
## 三、lint跳过指定代码
有时Lint会误报,或者特定代码明确不希望或不需要检查特定Lint问题。此时可使用以下方式来跳过指定java、xml的lint检测。
### 3.1、配置Lint对Java的检查
要在 Android 项目中特别禁止 Lint 检查某个 Java 类或方法,请向此 Java 代码添加`@SuppressLint` 注解。
下例说明了可以如何对 `onCreate` 方法中的 `NewApi` 问题关闭 Lint 检查。Lint 工具会继续检查该类的其他方法中的 NewApi 问题。
```java
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
```
下例说明了如何对 `FeedProvider` 类中的 `ParserError` 问题关闭 Lint 检查:
```java
@SuppressLint("ParserError")
public class FeedProvider extends ContentProvider {}
```
要禁止检查 Java 文件中的所有 Lint 问题,请使用如下 all 关键字:
```java
@SuppressLint("all")
```
### 3.2、配置Lint对XML的检查
您可以使用 `tools:ignore` 属性禁止 Lint 检查 XML 文件的特定部分。在 `lint.xml` 文件中添加以下命名空间值,以便 Lint 工具能识别此属性:
`namespace xmlns:tools="http://schemas.android.com/tools"`
下例说明了可以如何禁止 Lint 检查 XML 布局文件的 <LinearLayout> 元素中的 UnusedResources 问题。如果某个父元素声明了 ignore 属性,则该元素的子元素会继承此属性。在本例中,也会禁止 Lint 检查 <TextView> 子元素。
```xml
<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>
```
要禁止检查多个问题,请使用以逗号分隔的字符串列出要禁止检查的问题。例如:
```xml
tools:ignore="NewApi,StringFormatInvalid"
```
要禁止 Lint 检查 XML 元素中的所有问题,请使用如下 all 关键字:
```xml
tools:ignore="all"
```
## 四、查看所有Issue
android build tools每次大版本更新,都会带来一些新的lint规则。我们可以通过执行`<android-home>/tools/lint --list`来查看当前支持的所有Issue Id。
```
Valid issue categories:
Correctness
Correctness:Messages
Security
Performance
Usability:Typography
Usability:Icons
Usability
Accessibility
Internationalization
Bi-directional Text
Valid issue id's:
"ContentDescription": Image without contentDescription
"AddJavascriptInterface": addJavascriptInterface Called
"ShortAlarm": Short or Frequent Alarm
"AlwaysShowAction": Usage of showAsAction=always
...
```
## 参考文献
* [使用 Lint 改进您的代码](https://developer.android.com/studio/write/lint)
* [Android Lint:基本使用与配置](http://www.paincker.com/android-lint-1-usage)
* [你可能不知道的Android Studio/IDEA使用技巧](http://www.paincker.com/android-studio-skill)
* [Lint Options](http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.LintOptions.html)
- 计算机基础
- 简答1
- 简答2
- 专案
- 浅谈0与1
- 浅谈TCP_IP
- 浅谈HTTP
- 浅谈HTTPS
- 数据结构与算法
- 常见数据结构简介
- 常用算法分析
- 常见排序算法
- Java数据结构类问题简答
- 专案
- HashMap
- 浅谈二叉树
- 算法题
- 算法001_TopN问题
- 算法002_汉诺塔
- 编程思想
- 杂说
- 观点_优秀程序设计的18大原则
- 设计模式_创建型
- 1_
- 2_
- 设计模式_结构型
- 1_
- 2_
- 设计模式_行为型
- 1_
- 2_
- Java相关
- 简答1
- 简答2
- 专案
- 浅谈String
- 浅谈Java泛型
- 浅谈Java异常
- 浅谈动态代理
- 浅谈AOP编程
- 浅谈ThreadLocal
- 浅谈Volatile
- 浅谈内存模型
- 浅谈类加载
- 专案_数据结构
- 浅谈SpareArray
- Android相关
- Android面试题
- 专案
- 推送原理解析
- Lint
- 自定义Lint
- Lint使用
- 优化案
- Apk体积优化
- Kotlin相关
- 简答1
- 简答2
- 三方框架相
- Okhttp3源码分析
- ButterKnife源码分析
- Glide4源码分析
- Retrofit源码分析
- RxJava源码分析
- ARouter源码分析
- LeakCanary源码分析
- WMRouter源码分析
- 跨平台相关
- ReactNative
- Flutter
- Hybrid
- 优质源
- 资讯源
- 组件源
- 推荐