一、基本介绍

作为移动应用开发者,我们总希望发布的apk文件越小越好,不希望资源文件目录中没有用到的图片等资源也被打包进apk,不希望应用中使用了高于minSdk的api,也不希望AndroidManifest文件存在异常,lint就能解决我们的这些问题。

Android lint是在ADT 16提供的新工具,它是一个代码扫描工具,能够帮助我们识别代码结构存在的问题,主要包括:

  • Usability problems (like not specifying an input type on a text field) 可用性问题(如不指定输入类型的文本字段)
  • Layout performance problems (all the issues the old layoutopt tool used to find, and more) 布局性能问题
  • Unused resources未使用的冗余资源
  • Inconsistent array sizes (when arrays are defined in multiple configurations)在多个配置中的数组大小不一致文件
  • Accessibility and internationalization problems (hardcoded strings, missing contentDescription, etc) 可访问性和国际化的问题(硬编码字符串,缺少contentDescription等)
  • Icon problems (like missing densities, duplicate icons, wrong sizes, etc) 图标的问题
  • Missing translations (and unused translations)没有翻译的文本
  • Manifest errors 配置文件的错误

Android lint可以解决如上的问题,当然还有更多,具体的可以参考Android Lint Checks。

Android官方也总结了lint能解决的问题,如下图(对应lint窗口中的Category一栏的值)

  • correctness 正确性
  • usability 可用性
  • security 安全性
  • accessibility 可访问性
  • performance 表现,性能
  • I18n 国际化

lint是命令工具,它已经完美的集成到了Eclipse中,我们可以方便的使用。

通过lint,我们可以检测出每个问题的说明和问题的严重性,根据检测报告可以对程序作出改进。


二、命令行工具

在Android SDK的tools目录下有个叫lint.bat的文件,它就是lint的命令行工具。

2.1、扫描项目

命令行定位到目录【 sdk/tools】(若设置了环境变量则可直接运行lint命令),运行命令【 lint xxx】

lint命令后可以带一个或多个参数,参数之间用空格隔开,参数表示的是需要使用lint进行扫描的Android项目的目录

2.2、检查规则

  • 在执行lint命令时可以通过【--disable】选项要指定关闭的检查规则项
  • 在执行lint命令时可以通过【--enable】选项开启默认是关闭的检查项
  • 在执行lint命令时可以通过【--check】选项后跟检查项id来指定只进行某些检查   UnusedResources
  • 可以通过lint的【--list】选项来得到检查项类别和检查项id
  • 可以通过lint的【--show】选项后跟检查项id来得到一个检查项的详细说明
  • 可以使用【--help】选项来得到lint命令的一些帮助信息
    这些选项后跟要关闭的检查规则项的id或检查规则项的类型(Category,详见第四大点)。
    关于lint检查项的id和类型等信息请参考《Android Lint 检查规则列表》
    如:


2.3、输出html、TXT形式的报告

    在lint中,我们可以通过【--html】选项后接文件路径的形式把代码扫描结果以【html或TXT】文件的形式进行输出。

后缀名改为TXT则可生成纯文本文件:

2.4、批量删除未使用的资源文件

本文重点!当你第一次运行时 发现需要数千资源文件需要删除的时候就会很伤脑筋 手工逐条删除并不符合程序猿三大优秀品质:懒惰、没有耐心、骄傲 尝试过使用 vim 删除  发现操作起来也相当麻烦 大家可以参考下面的代码 使用FIle 获取生成的.txt中的文件信息 调用 File.delete();  方法删除 

详见另一个笔记《lint删除无用图片最佳示例》


三、在Eclipse中使用lint

从ADT16开始,lint就集成到了ADT中。该它在lint命令行的基础上新增了以下功能:
  • Automatic fixes for many warnings    自动修正大量警告【自动修复了许多警告】
  • Lint gets run automatically on various editing operations    当编辑操作完成后,立即自动运行【Lint在执行各种编辑操作之后会自动运行】
  • Ability to suppress types of errors as well as specific instances of an error    可以忽略一种类型的error,也可以忽略特定的一个error【能够抑制各种类型的错误和指定错误的实例】
  • Ability to configure issue severities    能够配置问题的严重性
  • Jump directly to the problem source from the lint view    通过lint视图能直接跳转到其问题对应的源码处
缺点:需要手动删除  当冗余文件数量多的时候会很伤脑筋

3.1、Automatic Lint
    Lint将在以下情况下自动运行:
  • Export an APK. In this case it runs lint in a special mode which only looks for fatal errors (which is faster) and aborts the export if any fatal errors are found. You can turn off this in the Lint Options
    在导出APK文件的时候,lint会做快速的扫描,以寻找重大的[致命的]错误。如果发现有重大的错误,导出APK的操作将被迫终止。
    【导出APK.这样的话将在一个特殊的模式下运行lint。它只能找出致命的错误(节省时间),如果发现致命的错误就会终止导出APK.】
  • Edit and Save an XML file, such as a layout file or a manifest file. In this case, all the file-scope checks that apply to the given file are run and editor markers are added for any issues found
    编辑和保存XML文件,lint也会自动扫描这些文件。另外从ADT20开始,对于java源码文件在编辑和保存后,lint也会对他们进行扫描。
    【编辑和保存XML文件(例如layout文件或者manifest文件),这样的话, 所有与之关联的文件都会重新检查。】
  • Use the layout editor. After every UI operation, file-scope checks (such as the various layoutopt rules) are run on the layout file and the results are shown in a special lint window (which can be opened from the error marker which shows in the top right corner of the layout editor when errors are found).
    对于使用layout editor来操作布局文件时,在每个UI操作后,lint也会自动扫描该布局文件。
    【用layout编辑器. 对每一个布局操作, 所有与之关联的文件都会重新检查。】
3.2、Lint Window
在Eclipse中,你可以通过两种方式来手动进行lint的扫描:
一种方式是通过工具栏,点击工具栏lint按钮  的下拉箭头,然后在下拉框中选择要进行lint扫描的工程
另一种方式是选中一个Android工程,单击右键,在下拉菜单中选择“Android tools”->"Run lint:check common erro"
运行lint之后,将显示一个包含有各种错误的 Lint Warrings窗口

错误信息中会给出具体的描述、类别、位置等,选择一个错误将会在右边的区域显示与之关联的解释


lint窗口的工具栏上有一些按钮,如下图所示
它们的意义分别如下
  •  Refresh, which re-runs the current analysis[分析] on the same projects
  •   Fix, which automatically fixes the issue (this applies to issues where a quickfix is available)
  • Suppress[忽略] this issue with an attribute or annotation[属性或注释]
  •  Ignore in this file (saves suppress information in lint.xml)
  •  Ignore in this project (ditto[同上])
  •   Always ignore
  •  Delete this lint marker
  •   Delete all lint markers
  •     Expand All,
  •     Collapse All
  •  Configure Columns[栏]     设置在lint Window中对于检查出的issue的哪些项显示哪些项不显示
  •  Edit Options     定制默认/全局的检查规则,把检查级别[Severity]设为”ignore“,其实就是忽略[suppress]该检查规则

 3.3、Quick Fixes

Many lint warnings have automatic fixes. For example, the various layoutopt fixes suggest replacements (e.g. replace wrap_content with 0dp). 
【许多lint警告有自动修复功能。例如,不同的layoutopt修正建议替换(例如:更换wrap_content与0DP)】
  • From the lint view, click the lightbulb to invoke a fix.【从lint视图,点击灯泡修复】
  • From the layout editor warning summary, click the Fix button to fix.【从布局编辑器警告摘要,单击“修复”按钮来修复】
  • And from the XML source editor, invoke the Quick Fix and pick the quick fix associated with the warning.【从XML源代码编辑器中,调用快速修复(按Ctrl-1),并选择快速修复警告】
3.4、Suppressing Errors(抑制错误)
From the editor quick fix menu, you can also choose to
【从编辑器的快速修复菜单,您也可以选择】
  • Ignore the warning in this file only【仅仅在这个文件中忽略警告】
  • Ignore the warning in this project【在这个项目中忽略警告】
  • Ignore the warning, period.【忽略警告,周期】
  • Ignore warnings using annotations or attributes.【使用注释或属性忽略警告】
 
3.5、Configure Columns
设置在lint Window中对于检查出的issue的哪些项显示哪些项不显示,如下图所示


3.6、Edit Options
选中一个问题,可以在右下角的下拉列表中选择检查级别。这使您可以设计特定的问题作为一个错误。
检查级别可以是:
  • Default
  • Fatal
  • Errro
  • Waring
  • Information
  • Ingore(即不检查)
需要完全的关闭一个问题,选择“忽略”。需要注意的是,这并不编辑每个项目的Lint设置。


        项目右键-->properties-->打开项目设置对话框,点击Android Lint的属性页。在“选项”对话框手动编辑严重程度伴随抑制错误将被记录在lint.xml文件,并且你的团队的其他人将获得相同的诊断配置。

        These choices are stored in a file named lint.xml in the project, which is also read by the command line tool. Thus, you can ignore warnings from the UI, and check in the lint.xml file with your source projects, and others running lint will not see warnings you have ignored (presumably because they have been manually verified).    

如果你只是想对lint的检查规则做些简单的定制,请参考《Android Lint 检查规则的定制(基本篇)》或英文官方文档
如果你想对lint的检查规则做些高级的定制,请参考官方文档 Writing New Lint Checks and Writing Custom Lint Rules

四、常见错误类型[Category]

1, Correctness:Messeges

  • (1)字符串国际化不完全
  • (2)国际化的字符串,在默认位置(default locale),没有定义

2,Correctness

  • (1)Xml中view的id重名
  • (2)代码中使用的某些API高于Manifest中的Min SDK
  • (3)字符串国际化中,同一名字的的String-Array对应的item值不相同 (4)Activity没有注册到Manifest
  • (5)使用已经废弃的api
  • (6)避免使用px,使用dp
  • (7)添加不需要的权限

3,Performance

  • (1) 避免在绘制或者解析布局(draw/layout)时,分配对象。eg,Ondraw()中实例化Paint().
  • (2)Layout中无用的参数。
  • (3)可优化的布局:如一个线性布局(一个Imageview和一个TextView),可被TextView和一个Compound Drawable代替。
  • (4)可优化的代码:如SparseArray可代替一个Interger2Object的Hashmap
  • (5)优化layout,比如如果子view都是wrap_content,则设置android:baselineAligned为false,则When set to false, prevents the layout from aligning its children's baselines.
  • (6)使用FloatMath代替Math,执行sin()和ceil(),以避免float的两次转换。
  • (7)Nested weight (内外均有weight)将拖累执行效果
  • (8)未被使用的资源
  • (9)Overdraw 即指定theme的activity会自己绘制背景,但是布局中会再一次设置背景
  • (10)View或view的父亲没有用

4,Security

  • (1)设置setJavascriptEnable将导致脚本攻击漏洞(XSS vulnerabilities)

5,Usability:Icons

  • (1) 图片尺寸在转换成不同dpi时,存在不能整除的问题,比如2*24px
  • (2)显示有些base 和browser的资源名不同,但图片内容完全相同。

6,Usability

  • (1)自定义view缺少默认的构造方法

7,Usability:Typography

  • (1)特殊字符需用编码代替,如“_”需要用“–”

8,Accessibility

  • (1)ImageView缺少src内容

eclipse lint工具介绍的更多相关文章

  1. java基础-Eclipse开发工具介绍

    java基础-Eclipse开发工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 所谓工欲善其事必先利其器,即将身为一名Java开发工程师怎么能没有一款好使的IDE呢?今天就 ...

  2. Eclipse开发工具介绍

    Eclipse是一个基于Java的.开放源码的.可扩展的应用开发平台,它为编程人员提供了一流的Java集成开发环境(Integrated Development Environment,IDE).在E ...

  3. 编程入门-Java开发工具介绍及Eclipse安装

    编程入门-Java开发工具介绍及Eclipse安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Java开发工具介绍 "源代码"一般是文字,所以可以使用记 ...

  4. 【转帖】四种BI 开源工具介绍-SpagoBI,openI,JasperSoft,Pentaho

    四种BI 开源工具介绍-SpagoBI,openI,JasperSoft,Pentaho 1 BI系统的简述 从技术角度来说 BI 包含了 ETL.DW.OLAP.DM等多环节.简单的说就是把交易系统 ...

  5. java--加强之 eclipse开发工具

    转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9943899 1.eclipse及IDE开发工具介绍 1.MyEcliose原本是Eclipse ...

  6. python接口自动化(四)--接口测试工具介绍(详解)

    简介 “工欲善其事必先利其器”,通过前边几篇文章的介绍,大家大致对接口有了进一步的认识.那么接下来让我们看看接口测试的工具有哪些. 目前,市场上有很多支持接口测试的工具.利用工具进行接口测试,能够提供 ...

  7. java基础-Idea开发工具介绍

    java基础-Idea开发工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前给大家介绍过一款Java的IDE叫eclipse,有些功能用起来不是很得心应手,尤其是在导报的 ...

  8. 提高你的代码稳定性与可读性-lint工具

    from://http://wiki.eoe.cn/page/Improving_Your_Code_with_lint.html 负责人:lingzideshensha 分任务原文链接:http:/ ...

  9. Android学习之Android studio TraceView和lint工具的使用具体解释

    上次讲述了一下Android studio Terminal的使用配置,今天又学习了一下关于Traceview和lint工具的使用. 首先来讲lint吧: Android lint工具是Android ...

随机推荐

  1. 【USACO 2.3.4】货币系统

    [描述] 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单 ...

  2. Oracle Pl/SQL编程基础

    Pl/SQL简介 提高应用程序的运行性能, 提供模块化的程序设计, 自定义标示符, 具有过程语言控制结构, 良好的兼容性, 处理运行错误. Pl/SQL语言基础 sql是关系数据库的基本操作语言. s ...

  3. How to Enable or Disable a cell in DataGridview Row ?

    Following link http://msdn.microsoft.com/en-us/library/ms171619.aspxhttp://windowsclient.net/blogs/f ...

  4. 较详细的sqlserver数据库备份、恢复(转)

    C#实现SQL数据库备份与恢复 有两种方法,都是保存为.bak文件.一种是直接用Sql语句执行,另一种是通过引用SQL Server的SQLDMO组件来实现: .通过执行Sql语句来实现 注意,用Sq ...

  5. GFStableList Adapter

    STL中,list的优点是插入.删除性能极佳(时间复杂度只需O(1)即可),而且非常重要的在删除节点后,其迭代器不失效,但list查找却不擅长.map由于其实现的数据结构为rb-tree,因此,其插入 ...

  6. SQL Server分区动态生成脚本(三)(按年份划分)

    --生成分区脚本DECLARE @DataBaseName NVARCHAR(50)--数据库名称DECLARE @TableName NVARCHAR(50)--表名称DECLARE @Column ...

  7. 绑定dropdownlist

    System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(); sqlconn.C; ...

  8. Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2)

    Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2) 上一节主要介绍了SolrCloud分布式索引的整体流程图以及索引链的实现,那么本节开始将分别介绍三个索引过程即LogUpdat ...

  9. VM虚拟机上 实现CentOS 6.X下部署LVS(NAT)+keepalived实现高性能高可用负载均衡

    一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 1 准备工作 a) 虚拟机上安装CentOS6.x操作系统,参考一下博客内容 http://www.cnblogs.com/seesea125 ...

  10. Android 正则表达式验证手机和邮箱格式是否正确

    demo例子: package it.com.cc; import java.util.regex.Matcher; import java.util.regex.Pattern; import an ...