代码优化--Android Lint(一)

原文链接:https://blog.csdn.net/luzhenyuxfcy/article/details/79398761

Android lint是在ADT16(Android SDK Tools 16 )提供的新工具,它是一个代码扫描工具,用于检测 Android 的代码质量。
可以在项目目录下通过命令调用(Windows:gradlew lint、Mac:./gradlew lint)获得 Lint 检测结果,生成详细的 xml 或者 html 报告文件;也可以通过 Android Studio 的工具栏【Analyze】->【Inspect Code】直接进行Lint 检查。

Lint优化哪些问题

  • 遗漏的翻译(没用上的翻译),比如国际化未被翻译的字段值
  • 布局性能(以前是 layoutopt工具,可以解决无用布局、嵌套太多、布局太多)
  • 未使用的资源
  • 不一致的数组大小
  • 国际化问题(硬编码)
  • 图标的问题(重复的图标,错误的大小)
  • 可用性问题(如不指定的文本字段的输入型)
  • manifest文件的错误

Lint 发现的每个问题都有描述信息和等级,我们可以很方便地定位问题,同时按照严重程度进行解决。当然这个“严重程度”可以手动调节,有些原则问题不容侵犯,必须提升到 error,而有的个别问题也可以无视。
但我们也不能过分依赖该工具,因为有些东西实际开发中会有自己的规则,有可能会出现冲突的地方,需根据实际需求。

Lint问题种类

  • Correctness: 不够完美的编码,比如硬编码、使用过时 API 等 ;
  • Performance: 对性能有影响的编码,比如:静态引用,循环引用等 ;
  • Internationalization: 国际化,直接使用汉字,没有使用资源引用等 ;
  • Security: 不安全的编码,比如在 WebView 中允许使用 JavaScript Interface 等 ;
  • Usability: 可用的,有更好的替换的,比如排版、图标格式建议.png格式 等 ;
  • Accessibility: 辅助选项,比如 ImageView 的 contentDescription 往往建议在属性中定义等;

Lint问题等级

方法:AS -> Settings -> Editor -> Inspections(检测配置页)

| Fatal :致命的
| Error :错误
| Warning :警告
| Weak Warning:比较弱的警告,提示比较弱
| Typo:拼写错误,绿色波浪下划线
| Information :一般信息,注释文档
↓ Ignore:忽略
检查问题列表详见 点我跳转

下面简要列举Android-Lint所检查的常见问题:

1. Correctness
    1) DuplicatedIds
    Layout中id应该唯一
    2) NewApi
    代码中使用的某些API高于Manifest中的Min SDK
    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
    避免在绘制或者解析布局(draw/layout)时分配对象。eg: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的按钮,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编码。
    ...

两种使用方式

1. 命令行执行

命令行路径
ADT:your ‘sdk’ dir\tools\lint.bat
AS:your ‘sdk’ dir\tools\bin\lint.bat

命令行使用
在 ’lint.bat’ 同级目录打开 cmd,可以通过 ’–help’ 获取对应的帮助。

Issue列表

  • lint –list : list 只是 issue的 id 和 summary 的列表
  • lint –show :show 显示详细的 issue 信息

disable/enable/check

  • lint –disable <list>
  • lint –enable <list>
  • lint –check <list>

Android-Lint 所支持要检测的 Issue 列表,默认有检查(Severity为非Ignore)和忽略(Severity为Ignore)之分。
可以用 disable不检查指定<list>中默认要检查的 id或 category;用 enable检查指定<list>中默认忽略的 id或 category;用 check只检查指定<list>中的 id或 category。

  • disable/enable是在 default列表的基础上,disable/enable给定列表里的;check是只检查列表里的。
  • <list>是 issue id或 category列表,用逗号隔开。

生成html/xml报表

  • lint –html <target_filename> <proj_dir>:生成 html 格式的报告 ;
  • lint –html <target_filename> --url filepath=url:生成的 html 文件中,还会引用别的文件,可以通过 url 参数替换其中的地址,使其指向公共访问的地方 ;
  • lint –simplehtml <target_filename> <proj_dir>:生成格式简单的 html 报告 ;
  • lint –xml <target_filename> <proj_dir>:生成 html 格式的报告;

自定义分析策略
lint –config <custom-lint_config_filename> <target_filename> <proj_dir>
虽然 disable/enable/check 选项可以改变本次检查的问题行为,但是下次还要再次指定。可以通过 config选项指定默认的全局配置文件。

注意:如果项目中已经有 lint.xml 文件,对于某条 issue 的检查来说,先用项目中 lint.xml 的规则,然后是 config 指定的规则,最后才是系统默认的规则。

lint在Gradle中可以使用”gradlew lint”命令行(Windows),”./gradlew lint”(mac)执行。详细可移步至:https://developer.android.com/studio/write/lint.html#commandline

2. IDE集成操作

Android Studio 中内置了 Lint,可以直接使用。
Lint 的使用路径:
工具栏 -> Analyze -> Inspect Code…
具体使用转至文章:代码优化--Android Lint(二)

参考文章:
官方,使用Lint改善您的代码
Android Lint
Android Lint:自定义Lint调试与开发
Android自定义Lint实践-美团
Android ------ 美团的Lint代码检查实践
Android工具:被你忽视的Lint

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容