lint.docx
《lint.docx》由会员分享,可在线阅读,更多相关《lint.docx(13页珍藏版)》请在冰豆网上搜索。
lint
lint
一:
什么是lint
Androidlint是在ADT16提供的新工具,它是一个代码扫描工具,能够帮助我们识别代码结构存在的问题。
之前是layoutopt命令。
它有两种形式:
一个命令行工具,另一个集成于Eclipse中。
检查范围主要包括:
1)布局性能(以前是layoutopt工具,可以解决无用布局、嵌套太多、布局太多)
2)未使用到资源
3)不一致的数组大小
4)国际化问题(硬编码)
5)图标的问题(重复的图标,错误的大小)
6)Manifest文件的错误
二:
有什么特点
是一款使用起来非常简单的布局优化工具。
它是AndroidSDK带来了一个工具,它可以自动分析你的布局,发现可能并不需要的布局元素,以降低布局复杂度
三:
工具位置
在AndroidSDK中——工具目录:
/tools目录中的lint.bat工具
四:
使用
1:
命令行工具的使用
命令行工具运行:
运行lint工具是相当简单的,只需要跟上一个布局文件或布局文件所在目录作为参数,需要注意的是,这里你必须包括布局文件或目录的完整路径,即使你当前就位于这个目录
SDKtools/目录下一个叫lint的工具.
运行:
lintD:
\Andorid\WorkSpace\UICollection就会检查当前目录下的源码
HTML报告
命令行工具也能生成HTML报告.它有如下优势:
a.每个错误的代码都有更详细的解释,还有提供更多信息属性的超链接
b.能指出错误代码的所在的行数
c.它能直接定位到源码的链接
d.对于图标的错误,图标本身就显示在报告中,方便对比
e.TogenerateanHTMLreport,justadd--htmlfilenameasanargument:
生成HTML报告:
lint--html储存路径/report.html文件路径
运行lint--help获取其他参数可用的信息
仅检查布局文件:
步骤一
1.使用ALT+R——>cmd进入dos命令窗口,进入sdk的tools文件夹下(如D:
\adt-bundle-windows-x86_64-20130219\sdk\tools)
步骤二
2.输入命令(新版本是lint.bat)(SDK16下就是lint.bat)空格后加xml文件的全路径名
步骤三
根据工具给出的提示信息找出低效和无用的布局。
Lint命令后可以带一个或多个参数,参数之间用空格隔开,参数表示的是需要使用lint进行扫描的Android项目的目录
这里就会给出相应的意见,这个xml文件给出的提示是高度不应该使用px,应该用dp。
这个linearlayout布局或父布局没有用处,背景属性转移到其他视图
考虑将文本值制定android可选
图像内容描述属性丢失
2:
Eclipse中的使用
通过eclipse界面,一种方法是在点击Eclipse左上角的打勾的按钮来选择分析项目,另一种方式是选中一个Android工程,单击右键,在下拉菜单中选择“Androidtools”->"Runlint:
checkcommonerro",。
这个会打开一个包含有各种错误的Lint窗口.选择一个错误将会在右边的区域显示与之关联的解释.
你可以在Lint窗口中双击错误去定位到与之关联的源码,每个警告图标将显示其严重性,对于已经修复的警告,有一个小灯泡.
窗口也有一个操作栏(在右上方角落),它可以让你
再次运行lint检查并刷新结果(刷新的过程中会变成停止按钮,如果你想停止的话可以点击停止按钮)
如果存在,运行和此错误关联修复
报告信息简介:
Thecom.gl.listener.BaseListenerServiceisnotregisteredinthemanifest提示说这个service没有在manifest注册,查看这个服务是个基类服务,不需要注册的。
还有其他的service也是提示没注册的,其他的service是没有使用到的废弃的类,可以直接删除了,酱紫就缩减了项目。
查看了大部分警告信息,大都是无关紧要的提示,是google推荐我们的一些详细的具体的规范,但有时候这些规范不利于我们编码,so不一定要完全遵守,举个例子:
比如说使用ImageView控件的时候会提示我们需要一个contentDescription属性,但是我们完全可以不写这个属性。
里面的参数为描述信息(Description)、类型(category)、位置(location)。
生成错误报告后我们的项目会报错
TheresourceR.dimen.bottom_tab_padding_drawableappearstobeunused提示说这个资源没有被使用,意思就是说这些冗余的资源文件中的信息,我们不再使用了,可以删除了。
其他还有很多这样的信息。
依次排查。
经过大量的筛查可以精简项目文件。
下面还有一条performance类型的警告信息,这类型的警告信息就是影响性能的警示信息了,能处理的尽量处理掉,比如:
ThisLinearLayoutlayoutoritsRelativeLayoutparentispossiblyuseless。
本项目里面定位到layout文件查看,发现是布局顶层使用了一个RelativeLayout,然后包着一个LinearLayout作为子布局,其他所有布局控件均在这个LinearLayout内部,意思就是说这里的布局层级冗余了,顶层的相对布局和二层的线性布局有一个无济于事,意思就是多了一层无用的布局,可以去除掉一层。
我们这里的处理是删除最外层RL布局,这样做的好处是LL内部的布局是依赖LL来布局的,如果删除LL内部的布局务必需要调整为依赖RL,会大量修改,而删除RL则不会影响到LL内部的控件布局。
如果我们想把错误去掉,我们就可以点击对钩按钮下拉菜单的clearlintwarnings,我们可以看到界面恢复到原来没有错误的版本
另一种方法就是直接修改代码,把错误去掉。
这时我们就需要借助生成的错误分析报告。
来具体分析。
Android-Lint检查的潜在问题
1问题描述--Issue
Android-Lint所要检查的问题以Issue来描述。
00000000000000000000000000000000000000000000000000000
Issue分9类
Correctness(正确性)/
Correctness:
Messages消息/
Security(安全性)/
Performance(性能)/
Usability(可用性):
Typography排版格式/
Usability:
Icons(图标)/
Usability(可用性)/
Accessibility(辅助)/
Internationalization(国际化)。
Issue以Severity来标识该Issue的危害程度:
Fatal(严重)/Error(错误)/Warning(警告)/Information(消息)/Ignore(忽略)。
对Issue的忽略操作其实也就是降低它的Severity为Ignore。
2检查的潜在问题
Android-Lint所检查的潜在问题,可以通过命令行$lint--show来获得所要扫描问题的详细列表。
下面简要列举Android-Lint所检查的常见问题:
plain代码
1.Correctness
1)DuplicatedIds
Layout中id应该唯一
2)NewApi
代码中使用的某些API高于Manifest中的MinSDK
3)InconsistentArrays
字符串国际化中,同一名字的的String-Array对应的item值不相同
4)Registered
Activity/Service/ContentProvider没有通过AndroidManifest注册
5)Deprecated
使用已经废弃的API
6)PxUsage
避免使用px,使用dp
2.Correctness:
Messeges
1)MissingTranslation
字符串国际化不完全
2)ExtraTranslation
国际化的字符串,在默认位置(defaultlocale),没有定义
3.Security
1)SetJavaScriptEnabled
不确定你的程序中确实需要JavaScript就不要执行SetJavaScriptEnabled。
2)ExportedContentProvider/ExportedReceiver/ExportedService/ExportedActivity
ContentProvider/Receiver/Service/Activity的exported为true时,设置一个Permission,让使用者获取了Permission才能使用。
3)HardcodedDebugMode
不要在manifest中设置android:
debuggable。
设置它,编译的任何版本都要采用指定的debug模式。
不设置,编译Eng版本采用debug模式;编译User版本采用release模式。
4.Performance
1)DrawAllocation
避免在绘制或者解析"
target="_blank"
class="relatedlink">布局(draw/layout)时分配对象。
E.g.,Ondraw()中实例化Paint对象。
2)ObsoleteLayoutParam
Layout中无用的参数。
3)UseCompoundDrawables
可优化的布局:
如包含一个Imageview和一个TextView的线性布局,可被采用CompoundDrawable的TextView代替。
4)UseSparseArrays
尽量用Android的SparseArray代替Hashmap
5)DisableBaselineAlignment
如果LinearLayout被用于嵌套的layout空间计算,它的android:
baselineAligned属性应该设置成false,以加速layout计算。
6)FloatMath
使用FloatMath代替Math。
7)NestedWeights
避免嵌套weight,那将拖累执行效率
8)UnusedResources/UnusedIds
未被使用的资源会是程序变大,并且编译速度降低。
9)Overdraw
如果为RootView指定一个背景Drawable,会先用Theme的背景绘制一遍,然后才用指定的背景,这就是所谓的“Overdraw”。
可以设置theme的background为null来避免。
10)UselessLeaf/UselessParent
View或view的父亲没有用
5.Usability:
Typography
1)TypographyDashes
特殊字符需用编码代替:
“–”需要用“–”;“—”需要用“—”
2)TypographyEllipsis
特殊字符需用编码代替:
“…”需要用“…”
3)TypographyOther
问题:
“(c)”需要用“©”
6.Usability:
Icons
1)IconNoDpi
Icon在nodpi和指定dpi的目录下都出现。
2)GifUsage
Image不要用GIF,最好用PNG,可以用JPG。
7.Usability
1)BackButton
Android中不要设计有Back的"
target="_blank"class="relatedlink">按钮,Android中一般有Back的硬按键。
2)ButtonCase
Button的“Ok”/“Cancel”显示大小写一定,不要全大写或全小写。
有标准的资源的字符串,不要自己再定义,而要用系统定义的:
@android:
string/ok和@android:
string/cancel
8.Accessibility
1)ContentDescription
ImageView和ImageButton应该提供contentDescription内容描述
9.Internationalization
1)HardcodeText
硬编码的字符串应该在资源里定义
2)EnforceUTF8
所有XML资源文件都应该以UTF-8编码
图标含义:
refresh,whichre-runsthecurrentanalysisonthesameprojects
刷新当前分析相同的项目
fix,whichautomaticallyfixestheissue(thisappliestoissueswhereaquickfixisavailable)自动修复这个问题(这适用于问题的quickfix可用在哪里)
suppressionthisissuewithanattributeorannotation
抑制这一问题有一个属性或注释
Ignoreinthisfile(savessuppressinformationinlint.xml)
忽略这个文件(保存在lint.xml抑制信息)
Ignoreinthisproject(ditto)
在这个项目上忽略(同上)
alwaysignore不处理
Deletethislintmarker删除这个lint标记
Deletealllintmarkers删除所有lint标记
Expand,collapse
configurecolumns用于设置在lintwindow中对于检查出的issue的那些项显示哪些项不显示
EditOptionsEditOptions点击该按钮会弹出lintPreferencedialog,
如上图,可以定制默认/全局的androidLint的基本检查规则,在其中可以设置所有项目默认的lint检查规则的检查级别,把检查级别(severity)设为ignore,其实就是忽略(suppress)该检查规则。
当你做如下操作时Lint将会自动运行:
a.导出APK.这样的话将在一个特殊的模式下运行lint。
它只能找出致命的错误(节省时间),如果发现致命的错误就会终止导出APK.
b.编辑和保存XML文件(例如layout文件或者manifest文件),这样的话,所有与之关联的文件都会重新检查