Android-Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通过代码检查,可发现潜在的问题,并能对Android程序进行优化处理。Android-Lint提供了命令行方式执行,还可与IDE(如Eclipse)集成,并提供了html形式的输出报告。Android-Lint可以方便的与项目中的其他自动系统(配置/ Build / 测试等)集成。
如果没有要求,那就在运行的时候不要使用lint,规避了很多问题,但也有可能隐藏了一些隐患。
如果不使用lint,可以右击项目,选择——>properties——>Android Lint Preference,在右边点击Configure Workspace Settings...—— >右边Run full error check...前面的勾取消,这样就好了。
简单说明下几个类型
以下内容转自http://androiddeveloper.diandian.com/post/2013-06-14/40050380131
常见类型:
一, Correctness:Messeges
(1)字符串国际化不完全
(2)国际化的字符串,在默认位置(default locale),没有定义
二,Correctness
(1)Xml中view的id重名
(2)代码中使用的某些API高于Manifest中的Min SDK
(3)字符串国际化中,同一名字的的String-Array对应的item值不相同 (4)Activity没有注册到Manifest
(5)使用已经废弃的api
(6)避免使用px,使用dp
(7)添加不需要的权限
三,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的父亲没有用
四,Security
(1)设置setJavascriptEnable将导致脚本攻击漏洞(XSS vulnerabilities)
五,Usability:Icons
(1) 图片尺寸在转换成不同dpi时,存在不能整除的问题,比如2*24px
(2)显示有些base 和browser的资源名不同,但图片内容完全相同。
六,Usability
(1)自定义view缺少默认的构造方法
七,Usability:Typography
(1)特殊字符需用编码代替,如“_”需要用“–”
八,Accessibility
(1)ImageView缺少src内容
关于解决lint检查出来的问题
转载自:http://blog.csdn.net/thl789/article/details/8036066
一、忽略XML文件中的问题
1.1 MissingPrefix问题
1.2 解决XML中的问题
可以在Lint Warnings View中解决(图中图标从左至右顺序)
Suppress this error with an annotation/attribute
点击该图标之后,直接更改了device_admin_sample.xml文件:
XML文件中直接增加了tools:ignore="MissingPrefix"。
Ignore in this file
在本文件中忽略,而在别的文件中仍然出现。
Ignore in this project
当前项目中都忽略该Issue。
执行之后,在本项目根目录下创建了lint.xml的文件,内容为:
- <?xml version="1.0"encoding="UTF-8"?>
- <lint>
- <issue id="MissingPrefix"severity="ignore" />
- </lint>
Always ignore
所有项目中都忽略。
二、解决Java代码中的问题
2.1 NewAPI问题
APIDemo中指明了支持最低API-1,但是代码里却用了API-3的接口,执行Lint会报错:
2.2 解决问题
把光标放在报错代码处,会自动提示如何快速fix。
1. 前面红色圆角框内是用Javaannotation方式解决(API-16之后才有):@SuppressLint‘<IssueId>’或@TargetAPI(<api>)
@SuppressLint ‘<IssueId>’用来忽略<IssueId>。适用范围在所调用的方法处或整个类中。
@TargetAPI(<api>)用来指示API用给定的<api>,而不是项目中指定的。适用范围在所调用的方法处或整个类中。
2. 后面粉红色圆角框内同XML中解决方式——在本文件/ 本项目/ 全局范围内忽略检查。
三、命令行下解决问题
从上面Eclipse环境下的解决问题的方式知道,可以指定文件来定制Lint检查Issue的处理方式。
下面是一个lint.xml的例子:
- <?xml version="1.0" encoding="UTF-8"?>
- <lint>
- <!-- Disable the given check in thisproject -->
- <issue id="IconMissingDensityFolder" severity="ignore" />
- <!-- Ignore the ObsoleteLayoutParamissue in the given files -->
- <issue id="ObsoleteLayoutParam">
- <ignore path="res/layout/activation.xml" />
- <ignore path="res/layout-xlarge/activation.xml" />
- </issue>
- <!-- Ignore the UselessLeaf issue inthe given file -->
- <issue id="UselessLeaf">
- <ignore path="res/layout/main.xml" />
- </issue>
- <!-- Change the severity of hardcodedstrings to "error" -->
- <issue id="HardcodedText" severity="error" />
- </lint>
Lint.xml中关键是对issue(用id指定)的severity进行指定,并且可以指定该issue作用于指定的文件还是当前项目。
把lint.xml放在项目的根目录中,命令行执行lint时候,lint就会用lint.xml中的规则。
另外,执行lint时还可以用参数--config<fileName>指定一个全局的配置用于所有的项目。当项目中已有lint.xml,则对于某个issue而言,在lint.xml中没有对该issue特别定制的情况下,--config指定的文件<fileName>中的该issue的定制才起作用。
四、定制Lint检查的规则
Android-Lint有默认的检查和报错的规则,但通过上面的分析知道,可以在Eclipse或者命令行下改变这种规则,从而可以定制Lint检查的规则。
推荐定制的路线:
- 在Eclipse中基于现有的问题,逐个分析并解决,然后我们就能得到一个Eclipse自动生成的lint.xml这个定制文件;
- 然后这个lint.xml用于Eclipse和/或命令行下进行后续的检查;
- 后续发现的问题再进一步处理,逐步完善lint.xml这个定制文件。
当然,如果有足够的时间,完全也可以Review一遍Android-Lint已经支持的所有的Issue,对他们逐个进行定制。对这些Issue的 Review,也能加深我们对Android设计中问题解决和性能优化方法的理解。
注意:这里教你如何忽略Lint发现的问题,但你千万不要上来就忽略,关键还是要解决这些发现的问题。即便是要忽略,也要确保你已经明白他们的含义,以及自己在做的操作(有时候,隐患恰恰被你给忽略过去了)!
特别地,一旦项目组决定采用Android-Lint,定制Lint规则要有对项目和团队负责的专人来定制执行。Lint的目的是尽量多的暴露问题,解决问题,而个人会有刻意隐藏/规避错误的倾向。所以,验收的时候,用大家讨论认可的Lint规则做统一的执行检查。