使用 Lint 改进您的代码
除了测试 Android 应用以确保其符合功能要求外,还必须确保代码不存在结构问题。结构混乱的代码会影响 Android 应用的可靠性和效率,增大维护代码的难度。例如,如果 XML 资源文件包含未使用的命名空间,则不仅占用空间,还会导致不必要的处理。其他结构问题,例如使用目标 API 版本不支持的已弃用的元素或 API 调用等,可能导致代码无法正常运行。
概览
Android Studio 提供一个名为 Lint 的代码扫描工具,可帮助您发现并纠正代码结构质量的问题,而无需实际执行该应用,也不必编写测试用例。该工具会报告其检测到的每个问题并提供该问题的描述消息和严重级别,以便您可以快速确定需要优先进行哪些关键改进。此外,您可以调低问题的严重级别,忽略与项目无关的问题,也可以调高严重级别,以突出特定问题。
Lint 工具可检查您的 Android 项目源文件是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进。在使用 Android Studio 时,配置的 Lint 和 IDE 检查会在您每次构建应用时运行。不过,您可以手动运行检查或从命令行运行 Lint。
注:在 Android Studio 中编译代码时,再运行 IntelliJ 代码检查可以简化代码检查。
图 1 显示了 Lint 工具如何处理应用源文件。
图 1. Lint 工具的代码扫描工作流
- 应用源文件
- 源文件包含组成 Android 项目的文件,包括 Java 和 XML 文件、图标和 ProGuard 配置文件等。
lint.xml
文件- 此配置文件可用于指定您希望排除的任何 Lint 检查以及自定义问题严重级别。
- Lint 工具
- 您可以从命令行或在 Android Studio 中对 Android 项目运行此静态代码扫描工具(请参阅手动运行检查)。Lint 工具检查可能影响 Android 应用质量和性能的代码结构问题。强烈建议您先纠正 Lint 检测到的任何错误再发布应用。
- Lint 检查结果
- 您可以在控制台或 Android Studio 的 Inspection Results 窗口中查看 Lint 检查结果。请参阅手动运行检查。
从命令行运行 Lint
要对项目目录中的文件列表运行 Lint,请使用以下命令:
- lint [flags] <project directory>
例如,您可以发出以下命令,扫描 myproject
目录及其子目录中的文件。问题 ID MissingPrefix
提示 Lint 仅扫描缺少 Android 命名空间前缀的 XML 属性。
- lint --check MissingPrefix myproject
要查看此工具支持的标志和命令行参数的完整列表,请使用以下命令:
- lint --help
Lint 输出示例
下例显示了对名为 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
以上输出显示没有任何错误,但列出四个警告,其中三个警告(ManifestOrder
、UsesMinSdkAttributes
和 UnusedResources
)出现在项目的 AndroidManifest.xml
文件中,一个警告 (IconMissingDensityFolder
) 出现在 Preferences.xml
布局文件中。
通过 Gradle 运行 Lint
如果项目包含构建变体,您可以在项目的根目录下输入以下命令之一,使用 Gradle 包装器对所有变体调用 lint
任务:
- 在 Windows 上:
- gradlew lint
- 在 Linux 或 Mac 上:
- ./gradlew lint
然而,如果您只想为特定构建变体运行 lint
任务,您必须大写变体名称并在其前面加上 lint
前缀。
- gradlew lintDebug
Lint 工具完成其检查后,Lint 报告会提供两个路径,分别指向该报告的 XML 和 HTML 版本。要了解有关从命令行运行 Gradle 任务的更多信息,请参见从命令行构建您的应用。
配置 Lint
默认情况下,在运行 Lint 扫描时,该工具会检查 Lint 支持的所有问题。您也可以限定 Lint 要检查的问题并为这些问题分配严重级别。例如,您可以禁止 Lint 检查与项目无关的特定问题,也可以将 Lint 配置为在报告中降低非关键问题的严重级别。
您可以配置不同级别的 Lint 检查:
- 全局(整个项目)
- 项目模块
- 生产模块
- 测试模块
- 打开的文件
- 类层次结构
- 版本控制系统 (VCS) 范围
在 Android Studio 中配置 Lint
在您使用 Android Studio 时,内置的 Lint 工具会检查您的代码。您可以通过以下两种方式查看警告和错误:
- 代码编辑器中的弹出文本。Lint 发现问题后,会用黄色突出显示有问题的代码,而对于更严重的问题,则会在代码下面添加红色下划线。
- 在 Lint 的 Inspection Results 窗口中,点击 Analyze > Inspect Code。请参阅手动运行检查。
配置 Lint 文件
您可以在 lint.xml
文件中指定 Lint 检查首选项。如果您是手动创建此文件,请将其置于 Android 项目的根目录。
lint.xml
文件由封闭的 <lint>
父标记组成,此标记包含一个或多个 <issue>
子元素。Lint 为每个 <issue>
定义唯一的 id
属性值。
- <?xml version="1.0" encoding="UTF-8"?>
- <lint>
- <!-- list of issues to configure -->
- </lint>
您可以在 <issue>
标记中设置严重级别属性,以更改某个问题的严重级别或禁止 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>
配置 Lint 对 Java 和 XML 源文件的检查
您可以禁止 Lint 检查 Java 和 XML 源文件。
提示:您可以在 Default Preferences 对话框中管理 Lint 检查 Java 或 XML 源文件的功能。选择 File > Other Settings > Default Settings,然后在 Default Preferences 对话框的左侧窗格中选择 Editor > Inspections。
配置 Lint 对 Java 的检查
要在 Android 项目中特别禁止 Lint 检查某个 Java 类或方法,请向此 Java 代码添加 @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 {
要禁止检查 Java 文件中的所有 Lint 问题,请使用如下 all
关键字:
- @SuppressLint("all")
配置 Lint 对 XML 的检查
您可以使用 tools:ignore
属性禁止 Lint 检查 XML 文件的特定部分。在 lint.xml
文件中添加以下命名空间值,以便 Lint 工具能识别此属性:
- namespace xmlns:tools="http://schemas.android.com/tools"
下例说明了可以如何禁止 Lint 检查 XML 布局文件的 <LinearLayout>
元素中的 UnusedResources
问题。如果某个父元素声明了 ignore
属性,则该元素的子元素会继承此属性。在本例中,也会禁止 Lint 检查 <TextView>
子元素。
- <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 选项
通过适用于 Gradle 的 Android 插件,您可以使用模块级 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
- }
- }
- ...
手动运行检查
您可以选择 Inspect Code > Analyze,手动运行已配置的 Lint 和其他 IDE 检查。检查结果显示在 Inspection Results 窗口中。
设置检查范围和配置文件
选择您要分析的文件(检查范围)和您要运行的检查(检查配置文件),具体操作如下:
- 在 Android 视图中,打开项目并选择此项目以及您要分析的文件夹或文件。
- 从菜单栏选择 Analyze > Inspect Code。
- 在 Specify Inspection Scope 对话框中查看设置。
图 2. 查看检查范围设置
取决于所选的是项目、文件夹还是文件,Specify Inspection Scope 对话框中显示的选项组合可能不尽相同。您可以通过选择其他单选按钮之一,更改要检查的内容。在 Specify Inspection Scope 对话框中查看 Specify Inspection Scope 对话框上可能出现的所有字段的描述。
- 在您选择一个项目、文件或目录时,Specify Inspection Scope 对话框显示选定项目、文件或目录的路径。
- 在您选择多个项目、文件或目录时,Specify Inspection Scope 对话框会在选中的文件旁边显示选中状态的单选按钮。
- 在 Inspection Profile 中,保留默认的配置文件 (Project Default)。
- 点击 OK 以运行检查。图 3 显示了通过运行 Inspect Code 所生成的 Lint 和其他 IDE 检查结果:
图 3. 选择问题以查看其解决方法
在左侧窗格树形视图中,通过展开并选择错误类别、类型和问题,查看检查结果。
右侧窗格显示所选错误类别、类型或问题的检查报告,并提供错误的名称和位置。在适用情况下,检查报告会显示问题摘要等其他信息,以帮助您纠正问题。在左侧窗格树形视图中,右键点击某个类别、类型或问题,显示上下文菜单。
取决于上下文,您可以执行以下全部或部分操作:跳到源文件、排除和包含选定项、消除问题、编辑设置、管理检查警报和重新运行检查。如需左侧工具栏按钮、上下文菜单项和检查报告字段的描述,请参阅 Inspection Tool Window。
使用自定义范围
您可以按如下方法使用 Android Studio 中提供的自定义范围之一:
- 在 Specify Inspection Scope 对话框中,点击 Custom Scope。
- 点击 Custom Scope 下拉列表,以显示选项。
图 4. 选择您要使用的自定义范围
- Project Files:当前项目中的所有文件。
- Project Production Files:仅限当前项目中的生产文件。
- Project Test Files:仅限当前项目中的测试文件。请参阅测试类型和位置。
- Open Files:仅限当前项目中已打开的文件。
- Module
:仅限当前项目中对应模块文件夹中的文件。 - Current File:仅限当前项目中的当前文件。在您已选择文件或文件夹时显示。
- Class Hierarchy:选择此选项并点击 OK,会出现一个对话框,其中显示当前项目中的所有类。使用此对话框中的 Search by Name 字段过滤并选择要检查的类。如果未过滤类列表,代码检查将检查所有类。
- 点击 OK。
创建自定义范围
如果您要检查的部分文件和目录不在当前可用的任何自定义范围内,您可以创建自定义范围。
- 在 Specify Inspection Scope 对话框中,选择 Custom Scope。
- 点击 Custom Scope 下拉列表后面的三个点。
图 5.“Specify Inspection Scope”对话框
此时将显示 Scopes 对话框。
图 6. 创建自定义范围
- 点击 Add 定义新的范围。
- 在随之弹出的 Add Scope 下拉列表中,选择 Local。
本地范围和共享范围可在项目内部用于 Inspect Code 功能。共享范围还可用于其他具有范围字段的项目功能。例如,在您点击 Edit Settings 更改 Find Usages 的设置时,随之弹出的对话框会显示一个 Scope 字段,您可以在其中选择共享范围。
图 7. 从 Find Usages 对话框选择共享范围
为范围命名并点击 OK。
Scopes 对话框的右侧窗格包含可用于定义自定义范围的选项。从下拉列表中选择 Project。
此时将显示可用的项目列表。
注:您可以为项目或软件包创建自定义范围。它们的步骤相同。
- 展开项目文件夹,选择您要添加到自定义范围中的项,然后点击右侧的按钮之一。
图 8. 定义自定义范围
- Include:包含此文件夹及其文件,但不包含其子文件夹中的任何文件。
- Include Recursively:包含此文件夹及其所有文件,以及子文件夹及其中的文件。
- Exclude:排除此文件夹及其文件,但不排除其子文件夹中的任何文件。
- Exclude Recursively:排除此文件夹及其所有文件,以及子文件夹及其中的文件。
图 9 显示包含 main 文件夹,并且递归包含 java 文件夹。蓝色表示部分包含的文件夹,而绿色表示递归包含的文件夹和文件。
图 9. 自定义范围的示例图
- 如果您选择 java 文件夹并点击 Exclude Recursively,java 文件夹及其中的所有子文件夹和文件将不再用绿色突出显示。
- 相反,如果您选择用绿色突出显示的 MainActivity.java 文件并点击“Exclude”,MainActivity.java 将不再用绿色突出显示,而 java 文件夹中的其他所有项目则用绿色突出显示。
- 点击 OK。自定义范围显示在下拉列表的底部。
查看和编辑检查配置文件
Android Studio 附带多种 Lint 及其他检查配置文件,可通过 Android 更新来更新此类配置文件。您可以原封不动地使用这些配置文件,也可以编辑它们的名称、描述、严重级别和范围。您还可以激活和停用全部配置文件组或一组配置文件中的个别配置文件。
要访问 Inspections 对话框,请:
- 选择 Analyze > Inspect Code。
在 Specify Scope 对话框中的 Inspection Profile 下面,点击 More。
此时将显示 Inspections 对话框,其中列出了一系列支持的检查及其描述。
图 10.支持的检查及其描述选择 Profile 下拉列表,在 Default (Android Studio) 和 Project Default(活动项目)检查项目之间切换。如需了解详细信息,请参阅此 IntelliJ Specify Inspection Scope Dialog 页面。
- 在左侧窗格的 Inspections 对话框中,选择最上面的配置文件类别,或展开一个组,选择特定配置文件。选择一种配置文件类别后,您可以将此类别中的所有检查项目当作一个检查项目进行编辑。
- 选择 Manage 下拉列表,以复制、重命名、将描述添加至、导出和导入检查项目。
- 操作完成后点击 OK。