Android工具:被你忽视的Lint

一、Lint简介

1.Android Studio提供了一个代码扫描工具被称为lint,它能帮助你在没有执行应用或者编写测试用例的情况下,帮助你识别和改正代码结构质量问题;
2.每个被工具检测出来的问题使用一个描述信息和安全级别报告,所以你能快速区分出需要优先执行改进。你可以降低问题的安全级别来忽略和你的项目不相关的问题,或者提高安全级别来突出某个问题;
注意:当你的代码在Android Studio中编译的时候,额外运行IntelliJ code inspections精简的代码检查;
下图展示了lint工具如何处理应用程序的源代码文件;
Android工具:被你忽视的Lint_第1张图片
  应用源代码文件:源码文件由你的Android项目文件组成,包含Java和XML文件,图标和Proguard配置文件;
  lint.xml文件:一个你可以用来指定任何想执行的Lint检查和自定义问题的安全级别的配置文件;
  lint工具:一个静态代码扫描工具,无论从命令行或者Andorid Studio中都可以在你的Android项目中运行。lint工具检查可能影响你的Android程序质量和性能的代码结构问题。强烈建议你在发布你的应用之前,修改任何lint检测出来的问题。
  lint检测结果:你可以在控制台或者Android Studio的Inspection Result窗口查看到lint检测的结果;
二、在命令行执行lint
在一个项目目录下运行lint检查一系列文件,使用下面的命令:

lint [flags] 
例如,你可以执行下面的命令,来扫描项目目录下和它的子目录下的文件。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] 
Flags:
--help                   This message.
--help            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_第2张图片
如果你只想为特定的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为每一个定义了唯一的id属性值;

    
        
通过设置标识的安全属性,你可以改变一个问题的安全级别,或者这个问题的lint检查。
提示:查看lint支持的完整问题列表,和它们相关的问题ID,执行lint --list命令;
lint.xml文件实例,下面的例子展示了一个lint.xml文件的内容。


    
    
    
    
        
        
    
    
    
        
    
    
    
为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布局文件中的元素的UnusedResources问题。在父元素中声明的ignore属性被子元素继承。在这个例子中,Lint检查也被禁止用于子元素;

    
为了禁止多个问题,使用逗号分隔的字符串列出要禁止的问题。如下:
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_第3张图片
显示在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_第4张图片
6.在左边的面板树视图中,通过展开和选择错误类型,类别和问题来查看检查的结果;
右边面板显示了选中的错误类型,类别和文件的检查报告,提供了错误的名字和位置。在适当的地方,检查报告展示了如问题摘要等其它信息来帮助你修改问题;
7.在左边面板树视图,右键单击类型,类别和问题来显示上下文菜单;
基于上下文,你可以执行所有或者一些如下操作:跳转到源码,排除和包含选中的选项,抑制问题,编辑设置,管理检查警告,和重新运行检查;
使用一个自定义的范围
你可以使用Android Studio提供的Custom Scope,如下:
1.在Specify Inspection Scope对话框,点击Custom scope;
2.点击Custom scope下拉列表会显示你的选项;
Android工具:被你忽视的Lint_第5张图片
  Project Files:所有在当前项目中的文件;
  Project Production Files:在当前项目中的生产文件;
  Project Test Files:在当前项目中的测试文件;
  Open Files:在当前项目中打开的文件;
  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_第6张图片
  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_第7张图片
Inpections对话框展示一个支持的检查和它们的描述列表;
3.选择Profile下拉列表在Default(Android Studio)和Project Default(活动项目)检查之间切换。
4.在Inspections对话框左面板,选择一个顶级配置类型,或者展开一个组选择一个配置。当你选择一个配置类别,你可以作为一个单独的检查来编辑所有的检查;
5.选择Manage下来列表来复制,重命名,和添加说明,导出和导入检查;
6.当你完成的时候,点击OK;
六、实践总结

在实际开发过程中,lint可以大大的帮助我们提高代码质量。针对新项目开始就引入该检查是比较理想的情况,但是针对于大多数已经比较成熟(或者说比较“烂 ”)的项目而言,Lint的检查规则应该根据自己项目的实际情况由少到多,有简到严。
下面就列举了一些,实际项目过程中常见的代码结构问题:
Imports
  Unused import:删除,减少不必要代码
   Android工具:被你忽视的Lint_第8张图片
Verbose or redundant code constructs
  Redundant array creation:不定长参数不传值
  
  Redundant type cast:本身就是该类型,不需要转换
  
XML
  Deprecated API usage in XML:使用标识,避免lint警告
  
  Unused XML schema declaration

    Namespace declaration is never used:删除,避免xml解析成本
    Android工具:被你忽视的Lint_第9张图片
  XML tag empty body:修改为<../>形式,消耗树内存,增加遍历节点性能;
  Android工具:被你忽视的Lint_第10张图片


新技术,新未来!欢迎大家关注 “1024工场”微信服务号 ,时刻关注我们的最新的技术讯息! (甭客气!尽情的扫描或者长按!)

你可能感兴趣的:(Android工具)