使用lint来改善你的代码 - UserWang/Android-Notes GitHub Wiki
英文原文地址:Improve Your Code with Lint
虽然不能测试你的应用程序是否符合你的功能需求,但是lint可以确保你的代码没有结构上的问题。糟糕的代码结构会影响你的应用程序的健壮性和效率,而且让你的代码很难去维护。例如,如果你的xml资源文件中有没有用到的命名空间,它不但占用空间,还会造成无意义的渲染。还有其他问题,比如使用过时的组件或调用targetAPI版本不支持的API,有可能会造成代码运行失败。
Android studio 自带的静态代码检查工具Lint能够很容易的帮你识别代码中存在的一些问题,而不需要运行应用程序或写任何测试用例。lint检测出的每一个问题都有描述信息和重要级别,你可以按照这个级别来确定需要修改的代码优先级。你也可以通过降低问题的优先级来忽略跟你的项目无关的问题,同样你也可以提高问题的优先级。你可以使用lint的命令行接口来把它集成到你的自动化测试流程中。
lint通过检测你的代码来发现潜在的bug或是关于正确性、安全性、性能、可用性、可访问性以及国际化方面的最优改进。你可以使用命令行或是直接通过android studio 来运行lint。
注意:当你使用android studio编译代码的时候,额外的 IntelliJ code inspections会运行来提升代码检查效率
图1展示了lint的工作流程。
程序资源文件
android程序的资源文件,包括Java类、xml文件、图标和混淆配置文件等。
lint.xml文件
一个配置文件,可以用它指定lint检查是你要排除的文件以及自定义问题级别
lint工具
一个静态代码检查工具,你可以通过命令行或者直接通过android studio来运行。lint工具可以检查影响你应用程序质量和性能的代码结构问题,在你发布你的应用程序之前,强烈建议你先把lint工具检测出来的问题解决掉。
lint检查的结果
你可以在android studio的控制台或Event Log中查看lint检查的结果。每一个问题都可以通过它在资源文件的位置和问题的描述来区分。
在版本大于16(包括16)的Android SDK Tools中都自动安装了lint工具。
当你构建你的app的时候,android studio 会自动运行配置好的lint和IDE检查。IDE检查和lint一起运行IntelliJ 代码检查来提升代码审查的效率。
注意:要查看和修改检查的级别,可以通过 File > Settings > Editor > Inspections来打开支持了检查列表的Inspection Configuration页。
使用android studio,你可以针对build.gradle文件中的一个构建版本或是所有的构建版本来运行lint检查。把lintOptions属性添加到build文件的* android 设置中。 这个Gradle构建文件的代码片段显示了如何设置 quiet 选项为 true 和 abortOnError *选项为 false 。
android {
lintOptions {
// set to true to turn off analysis progress reporting by lint
quiet true
// if true, stop the gradle build if errors are found
abortOnError false
// if true, only report errors
ignoreWarnings true
}
...
}
在android studio中手动的运行代码检查,可以通过应用或右键,选择Analyze > Inspect Code。你可以通过弹出的对话框中指定你要检查的范围和属性。 检查结果会展示在检查工具窗口,把鼠标放在上面你可以看到这个问题的大概,单机它就可以看到这个问题的一个全部描述。
对一个项目目录中的文件列表运行lint
lint [flags] <project directory>
比如,你可以通过下面这条命令来检查 myproject 目录和它的子目录。 MissingPrefix 是告诉lint只扫描缺少了命名空间的xml文件。
lint --check MissingPrefix myproject
查看lint支持的所以命令标记
lint --help
下面的例子展示了 Earthquake 项目通过命令行运行lint的控制台输出。
$ lint Earthquake
Scanning Earthquake: ...............................................................................................................................
Scanning Earthquake (Phase 2): .......
AndroidManifest.xml:23: Warning: <uses-sdk> tag appears after <application> tag [ManifestOrder]
<uses-sdk android:minSdkVersion="7" />
^
AndroidManifest.xml:23: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion="?" [UsesMinSdkAttributes]
<uses-sdk android:minSdkVersion="7" />
^
res/layout/preferences.xml: Warning: The resource R.layout.preferences appears to be unused [UnusedResources]
res: Warning: Missing density variation folders in res: drawable-xhdpi [IconMissingDensityFolder]
0 errors, 4 warnings
上面输出的信息列出了这个项目的4个警告和0个错误。其中有三个警告(ManifestOrder,UsesMinSdkAttributes和UnusedResource)发生在AndroidManifest.xml文件中.剩下的这个警告(IconMissingDensityFolder)发生在布局文件Preferences.xml中。
##配置lint
当你运行lint扫描的时候,它默认会检查所有它支持的问题。你可以限定lint检查的问题,并给他们指定严重级别。例如,你可以禁止lint检查那些和项目无关的问题,以及配置lint用一个低严重级别报告非关键问题。
你可以配置lint检查不同的级别:
-
Globally, for the entire project
-
Per project module
-
Per production module
-
Per test module
-
Per open files
-
Per class hierarchy
-
Per Version Control System (VCS) scopes
当你使用android studio的时候,可以用它内置的lint工具来检查你的代码。你可以通过两种方式来查看警告和错误:
-
代码编辑器窗口的弹出式的文字。如果lint发现了一个问题,它会把有问题的代码黄色高亮显示,如果是更严重的问题会在代码下边有红色下划线。
-
当你使用Analyze > Inspect Code后,可以在lint的检查结果窗口看到。
设置默认lint检查:
- 使用android studio 打开你的工程
- 选择 File > Other Settings > Default Settings
- 在默认配置对话框中选择Editor > Inspections
- 在Profile中选择Default或Project Default来分别设置检查范围是Android studio 还是当前工程
- 如果需要的话可以展开种类来选择lint配置。
你可以选择是检查某一项还是检查全部类型
- 点击“确定”。
在检查结果窗口展示lint检查的结果:
- 在Android Studio中打开你的工程,选择你想要测试的部分
- 选择Analyze > Inspect Code
- 在“选择检查范围”对话框中选择要检查的范围和模块。
指定的范围是你想要检查的文件,而指定的模块(profile)是lint检查执行的模块(对应上文"设置默认lint检查"中的第4条,译者注)
- 如果你想要更改lint设置,点击“…”按钮,在“Inspection”对话框中,点击 Manager 按钮去定义一个新的模块,指定你想要的lint设置,然后点击确定。
在“Inspection”对话框中你可以通过查找字符串来找到lint检查。注意在“Inspection”对话框中改变lint检查的模块并不会改变上文说到的默认设置,它只是改变当前这次检查的模块。
- 点击确定。
结果展示在“Inspection Result”窗口,并按照类型分类展示。
配置lint文件
你可以在lint.xml文件中指定你的lint检查的偏好设置。如果你手动创建这个文件,把它放在Android工程的根目录下。如果是通过Android Studio 来配置lint的偏好设置,lint.xml文件会自动的创建并添加到了你的android工程中。
lint.xml包含了一个封闭的父标签“”,同时该父标签中有一个或多个子标签“”。每一个子标签都通过 lint 定义的唯一id属性值标识。
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- list of issues to configure -->
</lint>
通过设置中的severity属性,你就可以禁止lint检查该问题或者是改变这个问题的严重级别。
小提示:想要查看lint工具支持的所有问题列表和他们对应的id,可以使用命令:lint --list。
lint.xml的例子
一个lint.xml文件的例子:
<?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>
在Java和XML文件中配置lint检查
你可以在Java和xml文件中禁用lint检查
小提示:如果你使用Android Studio,你可以使用** File > Settings > Project Settings > Inspections**特性来管理lint检查你的Java和XML文件
在Java文件中配置lint检查
要在Android 工程里的某一个类或方法禁用lint检查,可以在Java代码中添加 @SuppressLint 注解。
下面的例子展示了如何禁止lint检查onCreate方法中的NewApi问题。而它会继续检查该类的其他的方法的 NewApi问题。
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
下面的例子展示了如何禁止lint检查 FeedProvider的ParseError问题
@SuppressLint("ParserError")
public class FeedProvider extends ContentProvider {
如果想要禁止lint检查Java文件的所有问题,可以使用关键字“all”:
@SuppressLint("all")
在XML文件中配置lint检查
你可以使用tools:ignore属性来禁用lint检查你xml文件的指定部分。为了让lint识别到这个属性,你应该在xml文件中添加下面这个命名空间:
namespace xmlns:tools="http://schemas.android.com/tools"
下面这个例子展示了如何禁止lint检查xml布局文件中标签的 UnusedResources 问题。如果父标签声明了* 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"