一、Lint简介


1.Android Studio提供了一个代码扫描工具被称为lint,它能帮助你在没有执行应用或者编写测试用例的情况下,帮助你识别和改正代码结构质量问题;


2.每个被工具检测出来的问题使用一个描述信息和安全级别报告,所以你能快速区分出需要优先执行改进。你可以降低问题的安全级别来忽略和你的项目不相关的问题,或者提高安全级别来突出某个问题;


注意:当你的代码在Android Studio中编译的时候,额外运行IntelliJ code inspections精简的代码检查;


下图展示了lint工具如何处理应用程序的源代码文件;


怎么设置Android Lint 检查项 android lint工具_Gradle


  应用源代码文件:源码文件由你的Android项目文件组成,包含Java和XML文件,图标和Proguard配置文件;


  lint.xml文件:一个你可以用来指定任何想执行的Lint检查和自定义问题的安全级别的配置文件;


  lint工具:一个静态代码扫描工具,无论从命令行或者Andorid Studio中都可以在你的Android项目中运行。lint工具检查可能影响你的Android程序质量和性能的代码结构问题。强烈建议你在发布你的应用之前,修改任何lint检测出来的问题。


  lint检测结果:你可以在控制台或者Android Studio的Inspection Result窗口查看到lint检测的结果;


二、在命令行执行lint


在一个项目目录下运行lint检查一系列文件,使用下面的命令:


lint [flags] <project directory>

例如,你可以执行下面的命令,来扫描项目目录下和它的子目录下的文件。MissingPrefix问题ID告诉lint只扫描缺少Android命名空间前缀的XML属性


lint --check MissingPrefix myproject


提示:Error: No .class files were found in project "1.6-SNAPSHOT", so none of the classfile based checks could be run. Does the project need to be built first? [LintError]

处理:在Android Studio的项目中,会出现类似错误,可以尝试使用gradle执行;


查看工具支持的全部flag列表和命令行参数,使用下面的命令:


C:\Users\chengxiang.peng.QUNARSERVERS\QAndroidSources\QAndroid>lint --help
Usage: lint [flags] <project directories>
Flags:
--help                   This message.
--help <topic>           Help on the given topic, such as "suppress".
--list                   List the available issue id's and exit.
--version                Output version information and exit.
--exitcode               Set the exit code to 1 if errors are found.
--show                   List available issues along with full explanations.
... .... 
5                        Invalid command-line argument.


使用Gradle运行Lint


如果你的项目包含build variant,你可以使用Gradle wrapper来调用你所有variant的lint task,在你的项目根目录下输入如下命令:


C:\Users\chengxiang.peng.QUNARSERVERS\QAndroidSources\QAndroid>gradlew lint
Incremental java compilation is an incubating feature.                          
DEBUG BUILD                                                      
mavenUser or mavenPassword is missing                                                    
:common:preDebugUnitTestBuild UP-TO-DATE
... ...
:ui:compileDebugJavaWithJavac UP-TO-DATE
:ui:lint                 
Ran lint on variant release: 10 issues found
Ran lint on variant debug: 10 issues found
Wrote HTML report to file:///C:/Users/chengxiang.peng.QUNARSERVERS/QAndroidSources/QAndroid/ui/build/outputs/lint-results-debug.html
Wrote XML report to file:///C:/Users/chengxiang.peng.QUNARSERVERS/QAndroidSources/QAndroid/ui/build/outputs/lint-results-debug.xml
BUILD SUCCESSFUL


怎么设置Android Lint 检查项 android lint工具_Android_02


如果你只想为特定的build variant运行Lint任务,你必须使用lint作为前缀拼写variant的名字;


gradlew lintDebug

当lint工具完成它的检查时,lint报告提供了XML和HTML版本报告的两个路径;


三、配置lint


当你运行一个lint扫描,默认情况下工具会检查lint支持的所有问题。你也可以限制lint检查的问题,为这些问题分配严重程度。例如,你可以禁止和你的项目不相关的特定检查,也可以配置lint非关键性问题报告低的安全级别。


你可以配置不同级别的lint检查:


  1.全局(整个项目)


  2.项目模块


  3.生产模块


  4.测试模块


  5.打开的文件


  6.类层次结构


  7.版本控制系统(VCS)范围


在Android Studio中配置Lint


当你使用Andorid Studio的时候,内置的Lint工具会检查你的代码。你可以从以下两方面查看警告和错误:


  1.在代码编辑器中以弹出文本的形式。当Lint发现一个问题,它会使用黄色突出有问题的代码,对于更严重的问题,它会在代码下面画红线;


  2.你点击Analyze>Inspect Code后,在Lint的Inspection Results窗口中;


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>


为Java和XML资源文件配置Lint检查


你可以禁止Lint检查你的Java和XML文件;


提示:在Default Preferences对话框中你可以管理你的Java或者XML文件的检查功能。选择File->Other Settings>DefaultSettings,然后在Default Preferencts对话框的左边面板,选择Editor>Inspections;

在Java中配置Lint检查


为了在你的Android项目中禁止Lint检查某个指定的Java类或者方法,在这些Java代码中添加@SuppressLint注解;


下面的例子展示了你如何在onCreate方法中关闭Lint的NewAPI问题检查。在这个类的其它方法中Lint继续检查NewApi问题;


@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
下面的例子展示了如何在FeedProvider类中关闭ParserError问题检查;
@SuppressLint("ParserError")
public class FeedProvider extends ContentProvider {

抑制在Java文件中的所有lint问题检查,使用all关键字,如下:


@SuppressLint("all")


在XML中配置Lint检查


你可以使用tools:ignore属性来禁止Lint对你的XML文件指定部分进行检查。在lint.xml文件中加入下面的命名空间,Lint工具才能识别这些属性;


namespace xmlns:tools="http://schemas.android.com/tools"

下面的例子向你展示了如何禁止Lint检查一个XML布局文件中的<LinearyLayout>元素的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"

为了在XML元素中抑制所有的lint问题检查,使用all关键字,如下:


tools:ignore="all"


四、在Gradle中配置lint选项


Gradle的Android插件允许你在你模块级别的build.gradle文件中,使用lintOption{}块配置一些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窗口;


设置检查范围和配置


选择你想分析的文件(检查范围)和你想运行的检查(检查配置),如下:


1.在Android视图,打开你的项目,选择你想分析的一个文件夹或者一个文件;


2.从菜单栏,选择Analyze>Inspect Code;


3.在Spectify Inspection Scope对话框,查看设置;


怎么设置Android Lint 检查项 android lint工具_Android_03


显示在Spectify Inspection Scope对话框的选项组合区取决于是否你选择了一个项目,文件夹或者文件。你可以通过选择其它的单选按钮来改变你想检查的文件。查看Spectify Inspection Scope对话框中所有可选项的说明;


  当你选择一个项目,文件或者目录,Specity Sinpection Scope对话框显示你选择的项目,文件或者目录的路径;


  当你选择超过一个项目,文件,或者目录,Specity Inspection Scope对话框显示为你选中的文件显示一个选中的单选按钮;


4.在Inspection profile,保留默认的Profile(Project Profile);


5.点击OK来运行检查,下面展示了从Inspect Code运行后lint和其它IED的检查结果;


怎么设置Android Lint 检查项 android lint工具_Android_04


6.在左边的面板树视图中,通过展开和选择错误类型,类别和问题来查看检查的结果;


右边面板显示了选中的错误类型,类别和文件的检查报告,提供了错误的名字和位置。在适当的地方,检查报告展示了如问题摘要等其它信息来帮助你修改问题;


7.在左边面板树视图,右键单击类型,类别和问题来显示上下文菜单;


基于上下文,你可以执行所有或者一些如下操作:跳转到源码,排除和包含选中的选项,抑制问题,编辑设置,管理检查警告,和重新运行检查;


使用一个自定义的范围


你可以使用Android Studio提供的Custom Scope,如下:


1.在Specify Inspection Scope对话框,点击Custom scope;


2.点击Custom scope下拉列表会显示你的选项;


怎么设置Android Lint 检查项 android lint工具_Scope_05


  Project Files:所有在当前项目中的文件;


  Project Production Files:在当前项目中的生产文件;


  Project Test Files:在当前项目中的测试文件;


  Open Files:在当前项目中打开的文件;


  Module<your-module>:在当前项目中对应的模块中的文件;


  Current File:在你的项目中的当前文件。当你有一个文件或者文件夹被选中的时候出现;


  Class Hierarchy:当你选择它点击OK,一个展示当前项目所有类的对话框显示。使用对话框中的Search by Name选项,来过滤和选择检查的类。如果你没有过滤类列表,代码检查所有的类;


3.点击OK按钮;


创建一个自定义的范围


当你想检查的文件和目录,在当前可用的自定义范围都无法包含的时候,你可以创建一个Custom Scope。


1.在Specify Inspection Scope对话框,选择Custom scope;


2.点击Custom Scope下拉列表后面的"三个点"按钮,Scopes对话框就显示出来;


3.点击Add+定义一个新的范围;


4.在Add Scope下来列表中,选择Local;


5.给这个Scope命名,并点击OK;


local和shared Scope都能被用于项目的Inspect Code功能。Shared Scope也能被用于其它拥有Scope属性的项目功能。例如,当你点击Edit Settings来改变Find Usages设置,结果对话框中有一个Scope区域你可以来选择Shared Scope;


6.从下拉列表中,选择Project,有效的项目列表显示在下面;


7.展开项目文件夹,选择你想添加到自定义范围的,点击右边的一个按钮;


怎么设置Android Lint 检查项 android lint工具_Scope_06


  Include:包含这个文件夹和它的文件,但是不包含任何它的子文件夹;


  Include Recursively:包含这个文件夹和所有它的文件,和子文件和它们的文件;


  Exclude:不包含这个文件夹和它的文件,但是不包含任何它的子文件夹;


  Exclude Resursively:不包含这个文件夹和所有它的文件,和子文件和它们的文件;


如果你选择文件夹,点击Exclude Recursively,这个文件夹以及所有子文件夹和文件变为绿色;


如果你选择文件夹下绿色的文件,点击Exclude,文件不在为绿色,但是文件下的其它所有文件还是绿色的;


8.点击OK,自定义的范围展现在下拉列表中;


查看和编辑检查配置


Android Studio附带有Lint,其它检测文件通过Android更新来更新。你可以使用这些配置,或者编辑它们的名字,描述,严重程度和范围。你也可以激活或者停用整个配置组或这个一个组内的单个配置。


打开Inspections对话框:


1.选择Analyze>Inspect Code;


2.在Spectify Code对话框在Inspection Profile下,点击More;


怎么设置Android Lint 检查项 android lint工具_Profile_07


Inpections对话框展示一个支持的检查和它们的描述列表;


3.选择Profile下拉列表在Default(Android Studio)和Project Default(活动项目)检查之间切换。


4.在Inspections对话框左面板,选择一个顶级配置类型,或者展开一个组选择一个配置。当你选择一个配置类别,你可以作为一个单独的检查来编辑所有的检查;


5.选择Manage下来列表来复制,重命名,和添加说明,导出和导入检查;


6.当你完成的时候,点击OK;

六、实践总结


在实际开发过程中,lint可以大大的帮助我们提高代码质量。针对新项目开始就引入该检查是比较理想的情况,但是针对于大多数已经比较成熟(或者说比较“烂 ”)的项目而言,Lint的检查规则应该根据自己项目的实际情况由少到多,有简到严。


下面就列举了一些,实际项目过程中常见的代码结构问题:


Imports


  Unused import:删除,减少不必要代码


  

怎么设置Android Lint 检查项 android lint工具_Android_08


Verbose or redundant code constructs


  Redundant array creation:不定长参数不传值


  

怎么设置Android Lint 检查项 android lint工具_Android_09


  Redundant type cast:本身就是该类型,不需要转换


  

怎么设置Android Lint 检查项 android lint工具_Android_10


XML


  Deprecated API usage in XML:使用标识,避免lint警告


  

怎么设置Android Lint 检查项 android lint工具_Scope_11


  Unused XML schema declaration


    Namespace declaration is never used:删除,避免xml解析成本

    

怎么设置Android Lint 检查项 android lint工具_Android_12


  XML tag empty body:修改为<../>形式,消耗树内存,增加遍历节点性能;

  

怎么设置Android Lint 检查项 android lint工具_Scope_13