您的位置:首页 > 移动开发 > Android开发

Android Lint简介(转)

2014-09-23 10:51 295 查看
转载自原文:http://blog.csdn.net/hudashi/article/details/8333349,感谢原作者。

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

参照文章:/article/1697797.html
一、简介
AndroidLint是SDKTools16(ADT16)之后才引入的工具,通过它对Android工程源代码进行扫描和检查,可发现潜在的问题,以便程序员及早修正这个问题。AndroidLint提供了命令行方式执行,还可与IDE(如Eclipse)集成,并提供了html形式的输出报告。
由于AndroidLint在最初设计时就考虑到了independent于IDE,所以它可以很方便的与项目中的其他自动系统(配置/Build/测试等)集成.
AndroidLint主要用于检查以下这些错误:

1、Missingtranslations(andunusedtranslations)没有翻译的文本
2、Layoutperformanceproblems(alltheissuestheoldlayoutopttoolusedtofind,andmore)
3、Unusedresources未使用的冗余资源
4、Inconsistentarraysizes(whenarraysaredefinedinmultipleconfigurations)在多个配置中的数组大小不一致文件
5、Accessibilityandinternationalizationproblems(hardcodedstrings,missingcontentDescription,etc)
6、Iconproblems(likemissingdensities,duplicateicons,wrongsizes,etc)
7、Usabilityproblems(likenotspecifyinganinputtypeonatextfield)
8、Manifesterrors

当然AndroidLint远远不至检查以上的错误,更多的内容请参考《AndroidLint检查规则列表

在Eclipse中可以在菜单Window->Preference->“LintEerrochecking”中设置规则的检查级别,如图1所示。
检查级别可以是:
Default
Fatal
Errro
Waring
Information
Ingore(即不检查)

图1



如果你只是想对lint的检查规则做些简单的定制,请参考《AndroidLint检查规则的定制(基本篇)》或英文官方文档
如果你想对lint的检查规则做些高级的定制,请参考官方文档WritingNewLintChecksandWritingCustomLintRules.
二、命令行中使用Lint
2.1、基本使用

ThereisacommandlinetoolintheSDKtools/directorycalled
lint
.
IfyouhavetheSDK
tools/
directoryonyourpath,youcaninvokeitas“
lint
”.JustpointtoaspecificAndroidprojectdirectory.Youcanalsopointtoarandomdirectory,which(ifitisnotanAndroidproject)willbesearchedrecursivelyandallprojectsunderthatdirectorywillbechecked.(Andyoucanalsospecifymultipleprojectsseparatedbyspaces)
在AndroidSDK的tools下有个叫lint.bat的文件,它就是lint的命令行工具。
lint命令后可以带一个或多个参数,参数之间用空格隔开,参数表示的是需要使用lint进行扫描的Android项目的目录。
示例1
linux命令行

lint/src/astrid/
ScanningGreenDroid-GoogleAPIs:..
Scanningstream:...
Scanningapi:...........................
ScanningGDCatalog:.......................
ScanningGreenDroid:...........................................................
Scanningtests:...
Scanningfilters:....
Scanningtests:.....
Scanningastrid:....................................................................................................................................................
Scanningsimple:.......
api/res/values-ca:Error:Localecaismissingtranslationsfor:sync_SPr_bgwifi_key,sync_SPr_forget_key,sync_SPr_interval_values,sync_SPr_logged_in_prefix...(2more)[MissingTranslation]
astrid/res/values-ca:Error:Localecaismissingtranslationsfor:DLG_cancel,DLG_dismiss,DLG_ok,EPr_deactivated...(117more)[MissingTranslation]
api/res/values-cs:Error:Localecsismissingtranslationsfor:sync_SPr_bgwifi_key,sync_SPr_forget_key,sync_SPr_interval_values,sync_SPr_logged_in_prefix...(2more)[MissingTranslation]
(manylinesomitted)
43errors,466warnings

示例2
Window命令行

C:\DocumentsandSettings\Administrator>lintD:\workspace\TestScanningTest:....................................................................................................................................................................................................................................................ScanningTest(Phase2):......res\layout\internet_image_demo.xml:9:Warning:Theid"button1"isnotreferringtoanyviewsinthislayout[UnknownIdInLayout]android:layout_alignLeft="@+id/button1"^res\layout\internet_image_demo.xml:10:Warning:Theid"textView1"isnotreferringtoanyviewsinthislayout[UnknownIdInLayout]android:layout_below="@+id/textView1"^AndroidManifest.xml:52:Warning:Exportedreceiverdoesnotrequirepermission[ExportedReceiver]<receiverandroid:name=".AlarmReceiver">^res\menu\activity_main.xml:Warning:TheresourceR.menu.activity_mainappearstobeunused[UnusedResources]res\drawable-hdpi\ic_action_search.png:Warning:TheresourceR.drawable.ic_action_searchappearstobeunused[UnusedResources]res\values\strings.xml:7:Warning:TheresourceR.string.helloappearstobeunused[UnusedResources]<stringname="hello">你好!</string>^res\drawable-mdpi:Warning:Missingthefollowingdrawablesindrawable-mdpi:icon.png,icon2.png[IconDensities]res\drawable-xhdpi:Warning:Missingthefollowingdrawablesindrawable-xhdpi:icon.png,icon2.png[IconDensities]res\layout\internet_image_demo.xml:5:Warning:[Accessibility]MissingcontentDescriptionattributeonimage[ContentDescription]<ImageView^res\layout\activity_main.xml:17:Warning:[I18N]Hardcodedstring"goHello",shoulduse@stringresource[HardcodedText]android:text="goHello"^res\layout\activity_main.xml:23:Warning:[I18N]Hardcodedstring"打印所有任务栈信息",shoulduse@stringresource[HardcodedText]android:text="打印所有任务栈信息"^res\layout\activity_main.xml:29:Warning:[I18N]Hardcodedstring"打印所有服务信息",shoulduse@stringresource[HardcodedText]android:text="打印所有服务信息"^res\layout\activity_main.xml:35:Warning:[I18N]Hardcodedstring"打印进程信息",shoulduse@stringresource[HardcodedText]android:text="打印进程信息"^res\layout\hello.xml:23:Warning:[I18N]Hardcodedstring"pleaseclickme",shoulduse@stringresource[HardcodedText]android:text="pleaseclickme"^0errors,14warnings

2.2、DisablingChecks(--disable
在执行lint命令时可以通过--disable选项要指定关闭的检查规则项。--disable选项后接要关闭的检查规则项的id(比如示例3中的MissingTranslation)或检查规则项的类别(比如示例3中的Usability:Icons和示例4的Internationalization)。
关于lint检查项的id和类别(Category)等信息请参考《AndroidLint检查规则列表》
示例3

$lint--disableMissingTranslation,UnusedIds,Usability:Icons/src/astrid/

示例4

C:\DocumentsandSettings\Administrator>lint--disableInternationalizationD:\workspace\Test

ScanningTest:.........................................................................................................
........................................................................................................................
...................
ScanningTest(Phase2):......
res\layout\internet_image_demo.xml:9:Warning:Theid"button1"isnotreferringtoanyviewsinthislayout[UnknownIdI
nLayout]
android:layout_alignLeft="@+id/button1"
^
res\layout\internet_image_demo.xml:10:Warning:Theid"textView1"isnotreferringtoanyviewsinthislayout[Unknown
IdInLayout]
android:layout_below="@+id/textView1"
^
AndroidManifest.xml:52:Warning:Exportedreceiverdoesnotrequirepermission[ExportedReceiver]
<receiverandroid:name=".AlarmReceiver">
^
res\menu\activity_main.xml:Warning:TheresourceR.menu.activity_mainappearstobeunused[UnusedResources]
res\drawable-hdpi\ic_action_search.png:Warning:TheresourceR.drawable.ic_action_searchappearstobeunused[UnusedRe
sources]
res\values\strings.xml:7:Warning:TheresourceR.string.helloappearstobeunused[UnusedResources]
<stringname="hello">你好!</string>
^
res\drawable-mdpi:Warning:Missingthefollowingdrawablesindrawable-mdpi:icon.png,icon2.png[IconDensities]
res\drawable-xhdpi:Warning:Missingthefollowingdrawablesindrawable-xhdpi:icon.png,icon2.png[IconDensities]
res\layout\internet_image_demo.xml:5:Warning:[Accessibility]MissingcontentDescriptionattributeonimage[ContentDes
cription]
<ImageView
^
0errors,9warnings

2.3、enablingChecks(--enable和--check)
lint的有些检查项默认是关闭的(disable),在执行lint命令时可以通过--enable选项开启它。-enable选项后接要开启的检查规则项的id(比如示例5中的MissingTranslation)或检查规则项的类别(示例5中的Usability:Icons)
示例5

$lint--disableMissingTranslation,UnusedIds,Usability:Icons/src/astrid/

在执行lint命令时可以通过--check选项来指定只进行某些检查。-check选项后接要开启的检查规则项的id(比如示例6中的MissingPrefix)
示例6
$lint--checkMissingPrefix/src/astrid/
2.4、检查项类别和检查项id
可以通过lint的--list选项来得到检查项类别和检查项id.
比如:
$
lint
--list

Validissuecategories:

Correctness

Security

Performance

Usability

Usability:Icons

Accessibility

Internationalization


Validissueid's:

"ContentDescription":EnsuresthatimagewidgetsprovideacontentDescription

"DuplicateIds":Checksforduplicateidswithinasinglelayout

"StateListReachable":Looksforunreachablestatesina<selector>

"InefficientWeight":LooksforinefficientweightdeclarationsinLinearLayouts

"ScrollViewSize":ChecksthatScrollViewsusewrap_contentinscrollingdimension

"MergeRootFrame":Checkswhetheraroot<FrameLayout>canbereplacedwitha<merge>tag

...


可以通过lint的--show选项后跟检查项id来得到一个检查项的详细说明.
比如:
$lint--showMissingPrefix

MissingPrefix

-------------

Summary:DetectXMLattributesnotusingtheAndroidnamespace


Priority:8/10

Severity:Warning

Category:Correctness


MostAndroidviewshaveattributesintheAndroidnamespace.When

referencingtheseattributesyou*must*includethenamespaceprefix,

oryourattributewillbeinterpretedbyaaptasjustacustom

attribute.

当然你也可以通过《AndroidLint检查规则列表》来查阅检查项的id等详细信息
2.4、html形式的report
在lint中,我们可以通过--html选项接文件路径的形式把代码扫描结果以html文件的形式进行输出。
示例6

C:\DocumentsandSettings\Administrator>lint--htmlD:\workspace\Test\report.htm
lD:\workspace\Test

ScanningTest:.................................................................
................................................................................
................................................................................
...................
ScanningTest(Phase2):......
WroteHTMLreporttoD:\workspace\Test\report.html

html输出报告如图2所示
图2



Bydefault,linkstosourcefileswilljustuselocalfile://pathresources.YoucanremaptheURLstoadifferentprefixwiththe--urloption.Forexample:

$lint--html/tmp/report.html--url/src/MyProj=http://buildserver/src/MyProj


2.5、命令行帮助
在lint中,你可以使用--help选项来得到lint命令的一些帮助信息。
示例7
lint--help
三、Eclispe中使用Lint
从ADT16开始,lint就集成到了ADT中。该它在lint命令行的基础上新增了以下功能

Automaticfixesformanywarnings自动修正大量警告

Lintgetsrunautomaticallyonvariouseditingoperations当编辑操作完成后,立即自动运行

Abilitytosuppresstypesoferrorsaswellasspecificinstancesofanerror可以suppress(忽略)一种类型的erro,也可以suppress(忽略)特定的一个erro

Abilitytoconfigureissueseverities能够配置issue(问题)的severities(严重性)

Jumpdirectlytotheproblemsourcefromthelintview通过lint视图能直接跳转到其问题对应的源码处

3.1、AutomaticLint
Lint将在以下情况下自动运行:

ExportanAPK.Inthiscaseitrunslintinaspecialmodewhichonlylooksforfatalerrors(whichisfaster)andabortstheexportifanyfatalerrorsarefound.YoucanturnoffthisintheLintOptions.在导出APK文件的时候,lint会做快速的扫描,以寻找fatal的错误。如果发现有fatal的错误,导出APK的操作将被迫终止

EditandSaveandXMLfile,suchasalayoutfileoramanifestfile.Inthiscase,allthefile-scopechecksthatapplytothegivenfilearerunandeditormarkersareaddedforanyissuesfound.编辑和保存XML文件,lint也会自动扫描这些文件。另外从ADT20开始,对于java源码文件在编辑和保存后,lint也会对他们进行扫描。

Usethelayouteditor.AftereveryUIoperation,file-scopechecks(suchasthevariouslayoutoptrules)arerunonthelayoutfileandtheresultsareshowninaspeciallintwindow(whichcanbeopenedfromtheerrormarkerwhichshowsinthetoprightcornerofthelayouteditorwhenerrorsarefound).对于使用layouteditor来操作布局文件时,在每个UI操作后,lint也会自动扫描该布局文件。

3.2、LintWindow
在Eclipse中,你可以通过两种方式来手动进行lint的扫描:
一种方式是通过工具栏,双击图3-1中红色箭头指向的按钮,然后出现图3-2所示的下拉框,在该下拉选择要进行lint扫描的工程
图3-1



图3-2



一种方式是选中一个Android工程,单击右键,在下拉菜单中选择“Androidtools”->"Runlint:checkcommonerro",如图3-3所示
图3-3



运行lint之后,你将看到如图3-4图3-5所示的lint窗口
图3-4



图3-5



默认情况下,同一个类型的issue都是折叠成一块的,图3-4和图3-5是我手动展开的。
lint窗口的工具栏上有一些按钮,如图3-6所示
图3-6



它们的意义分别如下


Refresh,whichre-runsthecurrentanalysisonthesameprojects


Fix,whichautomaticallyfixestheissue(thisappliestoissueswhereaquickfixisavailable)


Suppressthisissuewithanattributeorannotation


Ignoreinthisfile(savessuppressinformationinlint.xml)


Ignoreinthisproject(ditto)


Alwaysignore


Deletethislintmarker


Deletealllintmarkers


ExpandAll,


CollapseAll


ConfigureColumns用于设置在lintWindow中对于检查出的issue的哪些项显示哪些项不显示,如图3-7所示


EditOptionsEditOptions点击该按钮会弹出LintPreferencedialog,如图1或图3-8在里面你可以定制默认/全局的AndroidLint的基本检查规则,在其中可以设置所有项目默认的lint检查规则的检查级别,把检查级别(Severity)设为”ignore“,其实就是忽略(suppress)该检查规则

ConfigureColumnsletsyoueditwhichcolumnsarevisible.Thereareseveralnewcolumnsyoucandisplay,suchasCategory,Priority,etc,andyoucanclickoncolumnheaderstosortthedisplaybythegivencolumn.There'salsoanew"Location"column,shownbydefault,whichincorporatesseveraldifferentpiecesofinformation:thefilename,thelinenumber,theparentfoldername(usefulwhenlookingattranslationorconfigurationissues),andtheprojectname:
ConfigureColumns用于设置在lintWindow中对于检查出的issue的哪些项显示哪些项不显示,如图3-7所示
图3-7



TheEditOptionsactionsbringsuptheLintPreferencedialog,whichhasalsobeenimproved.Youcannowsearchthroughtheoptionsbyfilter:
点击EditOptions按钮会弹出处理LintPreferencedialog,在里面可以定制默认/全局的AndroidLint的基本检查规则
图3-8



3.3、QuickFixes
Manylintwarningshaveautomaticfixes.Forexample,thevariouslayoutoptfixessuggestreplacements(e.g.replacewrap_contentwith0dp).

Fromthelintview(如图3-6所示),clickthelightbulb


toinvokeafix.

Fromthelayouteditorwarningsummary,clicktheFixbuttontofix.

AndfromtheXMLsourceeditor,invoketheQuickFix(Ctrl-1orCommand-1)andpickthequickfixassociatedwiththewarning.

3.4、SuppressingErrors(检查规则的基本定制)
Fromtheeditorquickfixmenu(如图3-9所示),youcanalsochooseto

Ignorethewarninginthisfileonly

Ignorethewarninginthisproject

Ignorethewarning,period.

Ignorewarningsusingannotationsorattributes,asexplainedhere.

图3-9



(Ifyoudonotseethelintfixactioninthequickfixlist,seetheKnownBugssection)

Thesechoicesarestoredinafilenamed
lint.xml
intheproject,whichisalsoreadbythecommandlinetool.Thus,youcanignorewarningsfromtheUI,andcheckinthe
lint.xml
filewithyoursourceprojects,andothersrunninglintwillnotseewarningsyouhaveignored(presumablybecausetheyhavebeenmanuallyverified).
你的选择在被存在Android工程目录下的
lint.xml
文件中
关于此的详细内容请参考《AndroidLint检查规则的定制(基本篇)
结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: