关于Android lint

来源:互联网 发布:淘宝小铺名称能改吗 编辑:程序博客网 时间:2024/06/05 21:54

原文:http://tools.android.com/tips/lint

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问题

Android-Lint Issue MissingPrefix

1.2 解决XML中的问题

 

可以在Lint Warnings View中解决(图中图标从左至右顺序)

 

 Android-Lint ignore this Suppress this error with an annotation/attribute

点击该图标之后,直接更改了device_admin_sample.xml文件:

XML文件中直接增加了tools:ignore="MissingPrefix"

 

 Android-Lint ignore file Ignore in this file

在本文件中忽略,而在别的文件中仍然出现。

 

 Android-Lint ignore project Ignore in this project

当前项目中都忽略该Issue。

执行之后,在本项目根目录下创建了lint.xml的文件,内容为:

[html] view plaincopy
  1. <?xml version="1.0"encoding="UTF-8"?>  
  2. <lint>  
  3.     <issue id="MissingPrefix"severity="ignore" />  
  4. </lint>  

 

 Android-Lint ignore all Always ignore

所有项目中都忽略。


二、解决Java代码中的问题

 

2.1 NewAPI问题  

APIDemo中指明了支持最低API-1,但是代码里却用了API-3的接口,执行Lint会报错:

Android-Lint Issue NewAPI

2.2 解决问题

 

把光标放在报错代码处,会自动提示如何快速fix。

1. 前面红色圆角框内是用Javaannotation方式解决(API-16之后才有):@SuppressLint‘<IssueId>’或@TargetAPI(<api>)

@SuppressLint ‘<IssueId>’用来忽略<IssueId>。适用范围在所调用的方法处或整个类中。

@TargetAPI(<api>)用来指示API用给定的<api>,而不是项目中指定的。适用范围在所调用的方法处或整个类中。

2. 后面粉红色圆角框内同XML中解决方式——在Android-Lint ignore file本文件/ Android-Lint ignore project本项目/ Android-Lint ignore all全局范围内忽略检查。

 

三、命令行下解决问题

 

从上面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规则做统一的执行检查。



0 0