代碼優(yōu)化--Android Lint(一)

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

Android lint是在ADT16(Android SDK Tools 16 )提供的新工具,它是一個(gè)代碼掃描工具,用于檢測(cè) Android 的代碼質(zhì)量邀杏。
可以在項(xiàng)目目錄下通過命令調(diào)用(Windows:gradlew lint叠赦、Mac:./gradlew lint)獲得 Lint 檢測(cè)結(jié)果锤躁,生成詳細(xì)的 xml 或者 html 報(bào)告文件;也可以通過 Android Studio 的工具欄【Analyze】->【Inspect Code】直接進(jìn)行Lint 檢查。

Lint優(yōu)化哪些問題

  • 遺漏的翻譯(沒用上的翻譯)缝龄,比如國(guó)際化未被翻譯的字段值
  • 布局性能(以前是 layoutopt工具寨闹,可以解決無用布局胶坠、嵌套太多、布局太多)
  • 未使用的資源
  • 不一致的數(shù)組大小
  • 國(guó)際化問題(硬編碼)
  • 圖標(biāo)的問題(重復(fù)的圖標(biāo)繁堡,錯(cuò)誤的大猩蛏啤)
  • 可用性問題(如不指定的文本字段的輸入型)
  • manifest文件的錯(cuò)誤

Lint 發(fā)現(xiàn)的每個(gè)問題都有描述信息和等級(jí),我們可以很方便地定位問題椭蹄,同時(shí)按照嚴(yán)重程度進(jìn)行解決闻牡。當(dāng)然這個(gè)“嚴(yán)重程度”可以手動(dòng)調(diào)節(jié),有些原則問題不容侵犯绳矩,必須提升到 error罩润,而有的個(gè)別問題也可以無視。
但我們也不能過分依賴該工具翼馆,因?yàn)橛行〇|西實(shí)際開發(fā)中會(huì)有自己的規(guī)則割以,有可能會(huì)出現(xiàn)沖突的地方,需根據(jù)實(shí)際需求应媚。

Lint問題種類

  • Correctness: 不夠完美的編碼严沥,比如硬編碼、使用過時(shí) API 等 中姜;
  • Performance: 對(duì)性能有影響的編碼消玄,比如:靜態(tài)引用,循環(huán)引用等 丢胚;
  • Internationalization: 國(guó)際化翩瓜,直接使用漢字,沒有使用資源引用等 携龟;
  • Security: 不安全的編碼兔跌,比如在 WebView 中允許使用 JavaScript Interface 等 ;
  • Usability: 可用的骨宠,有更好的替換的浮定,比如排版、圖標(biāo)格式建議.png格式 等 层亿;
  • Accessibility: 輔助選項(xiàng)桦卒,比如 ImageView 的 contentDescription 往往建議在屬性中定義等;

Lint問題等級(jí)

方法:AS -> Settings -> Editor -> Inspections(檢測(cè)配置頁(yè))

| Fatal :致命的
| Error :錯(cuò)誤
| Warning :警告
| Weak Warning:比較弱的警告匿又,提示比較弱
| Typo:拼寫錯(cuò)誤方灾,綠色波浪下劃線
| Information :一般信息,注釋文檔
↓ Ignore:忽略
檢查問題列表詳見 點(diǎn)我跳轉(zhuǎn)

下面簡(jiǎn)要列舉Android-Lint所檢查的常見問題:

1. Correctness
    1) DuplicatedIds
    Layout中id應(yīng)該唯一
    2) NewApi
    代碼中使用的某些API高于Manifest中的Min SDK
    3) InconsistentArrays
    字符串國(guó)際化中,同一名字的String-Array對(duì)應(yīng)的item值不相同
    4) Registered
    Activity/Service/ContentProvider沒有通過AndroidManifest注冊(cè)
    5) Deprecated
    使用已經(jīng)廢棄的API
    6) PxUsage
    避免使用px裕偿,使用dp

2. Correctness:Messeges
    1) MissingTranslation
    字符串國(guó)際化不完全
    2) ExtraTranslation
    國(guó)際化的字符串洞慎,在默認(rèn)位置(defaultlocale),沒有定義

3. Security
    1) SetJavaScriptEnabled
    不確定你的程序中確實(shí)需要JavaScript就不要執(zhí)行SetJavaScriptEnabled嘿棘。
    2)ExportedContentProvider/ExportedReceiver/ExportedService/ExportedActivity
    ContentProvider/Receiver/Service/Activity的exported為true時(shí)劲腿,設(shè)置一個(gè)Permission,讓使用者獲取了Permission才能使用鸟妙。
    3) HardcodedDebugMode
    不要在manifest中設(shè)置android:debuggable焦人。
    設(shè)置,編譯的任何版本都要采用指定的debug模式重父。不設(shè)置花椭,編譯Eng版本采用debug模式;編譯User版本采用release模式房午。

4. Performance
    1) DrawAllocation
    避免在繪制或者解析布局(draw/layout)時(shí)分配對(duì)象矿辽。eg:Ondraw()中實(shí)例化Paint對(duì)象。
    2) ObsoleteLayoutParam
    Layout中無用的參數(shù)郭厌。
    3) UseCompoundDrawables
    可優(yōu)化的布局:如包含一個(gè)Imageview和一個(gè)TextView的線性布局袋倔,可被采用CompoundDrawable的TextView代替。
    4) UseSparseArrays
    盡量用Android的SparseArray代替Hashmap折柠。
    5) DisableBaselineAlignment
    如果LinearLayout被用于嵌套的layout空間計(jì)算奕污,它的android:baselineAligned屬性應(yīng)該設(shè)置成false,以加速layout計(jì)算液走。
    6) FloatMath
    使用FloatMath代替Math。
    7) NestedWeights
    避免嵌套weight贾陷,那將拖累執(zhí)行效率缘眶。
    8) UnusedResources/UnusedIds
    未被使用的資源會(huì)是程序變大,并且編譯速度降低髓废。
    9) Overdraw
    如果為RootView指定一個(gè)背景Drawable巷懈,會(huì)先用Theme的背景繪制一遍,然后才用指定的背景慌洪,這就是所謂的“Overdraw”顶燕。
    可以設(shè)置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的目錄下都出現(xiàn)。
    2) GifUsage
    Image不要用GIF频伤,最好用PNG恳谎,可以用JPG。

7. Usability
    1) BackButton
    Android中不要設(shè)計(jì)有Back的按鈕,Android中一般有Back的硬按鍵因痛。
    2) ButtonCase
    Button的“Ok”/“Cancel”顯示大小寫一定不要全大寫或全小寫婚苹。有標(biāo)準(zhǔn)的資源的字符串,不要自己再定義鸵膏,而要用系統(tǒng)定義的:@android:string/ok和@android:string/cancel膊升。

8. Accessibility
    1) ContentDescription
    ImageView和ImageButton應(yīng)該提供contentDescription。

    9. Internationalization
    1) HardcodeText
    硬編碼的字符串應(yīng)該在資源里定義谭企。
    2) EnforceUTF8
    所有XML資源文件都應(yīng)該以UTF-8編碼廓译。
    ...

兩種使用方式

1. 命令行執(zhí)行

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

命令行使用
在 ’lint.bat’ 同級(jí)目錄打開 cmd,可以通過 ’–help’ 獲取對(duì)應(yīng)的幫助赞咙。

Issue列表

  • lint –list : list 只是 issue的 id 和 summary 的列表
  • lint –show :show 顯示詳細(xì)的 issue 信息

disable/enable/check

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

Android-Lint 所支持要檢測(cè)的 Issue 列表责循,默認(rèn)有檢查(Severity為非Ignore)和忽略(Severity為Ignore)之分。
可以用 disable不檢查指定<list>中默認(rèn)要檢查的 id或 category攀操;用 enable檢查指定<list>中默認(rèn)忽略的 id或 category院仿;用 check只檢查指定<list>中的 id或 category。

  • disable/enable是在 default列表的基礎(chǔ)上速和,disable/enable給定列表里的歹垫;check是只檢查列表里的。
  • <list>是 issue id或 category列表颠放,用逗號(hào)隔開排惨。

生成html/xml報(bào)表

  • lint –html <target_filename> <proj_dir>:生成 html 格式的報(bào)告 ;
  • lint –html <target_filename> --url filepath=url:生成的 html 文件中碰凶,還會(huì)引用別的文件暮芭,可以通過 url 參數(shù)替換其中的地址,使其指向公共訪問的地方 欲低;
  • lint –simplehtml <target_filename> <proj_dir>:生成格式簡(jiǎn)單的 html 報(bào)告 辕宏;
  • lint –xml <target_filename> <proj_dir>:生成 html 格式的報(bào)告;

自定義分析策略
lint –config <custom-lint_config_filename> <target_filename> <proj_dir>
雖然 disable/enable/check 選項(xiàng)可以改變本次檢查的問題行為砾莱,但是下次還要再次指定瑞筐。可以通過 config選項(xiàng)指定默認(rèn)的全局配置文件腊瑟。

注意:如果項(xiàng)目中已經(jīng)有 lint.xml 文件聚假,對(duì)于某條 issue 的檢查來說,先用項(xiàng)目中 lint.xml 的規(guī)則闰非,然后是 config 指定的規(guī)則膘格,最后才是系統(tǒng)默認(rèn)的規(guī)則。

lint在Gradle中可以使用”gradlew lint”命令行(Windows),”./gradlew lint”(mac)執(zhí)行财松。詳細(xì)可移步至:https://developer.android.com/studio/write/lint.html#commandline

2. IDE集成操作

Android Studio 中內(nèi)置了 Lint闯袒,可以直接使用。
Lint 的使用路徑:
工具欄 -> Analyze -> Inspect Code…
具體使用轉(zhuǎn)至文章:代碼優(yōu)化--Android Lint(二)

參考文章:
官方,使用Lint改善您的代碼
Android Lint
Android Lint:自定義Lint調(diào)試與開發(fā)
Android自定義Lint實(shí)踐-美團(tuán)
Android ------ 美團(tuán)的Lint代碼檢查實(shí)踐
Android工具:被你忽視的Lint

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末政敢,一起剝皮案震驚了整個(gè)濱河市其徙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喷户,老刑警劉巖唾那,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褪尝,居然都是意外死亡闹获,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門河哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來避诽,“玉大人,你說我怎么就攤上這事璃谨∩陈” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵佳吞,是天一觀的道長(zhǎng)拱雏。 經(jīng)常有香客問我,道長(zhǎng)底扳,這世上最難降的妖魔是什么铸抑? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮衷模,結(jié)果婚禮上鹊汛,老公的妹妹穿的比我還像新娘。我一直安慰自己阱冶,他們只是感情好柒昏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熙揍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氏涩。 梳的紋絲不亂的頭發(fā)上届囚,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音是尖,去河邊找鬼意系。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饺汹,可吹牛的內(nèi)容都是我干的蛔添。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼迎瞧!你這毒婦竟也來了夸溶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凶硅,失蹤者是張志新(化名)和其女友劉穎缝裁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體足绅,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捷绑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氢妈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粹污。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖首量,靈堂內(nèi)的尸體忽然破棺而出壮吩,到底是詐尸還是另有隱情,我是刑警寧澤蕾总,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布粥航,位于F島的核電站,受9級(jí)特大地震影響生百,放射性物質(zhì)發(fā)生泄漏递雀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一蚀浆、第九天 我趴在偏房一處隱蔽的房頂上張望缀程。 院中可真熱鬧,春花似錦市俊、人聲如沸杨凑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撩满。三九已至,卻和暖如春绅你,著一層夾襖步出監(jiān)牢的瞬間伺帘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工忌锯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伪嫁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓偶垮,卻偏偏與公主長(zhǎng)得像张咳,于是被迫代替她去往敵國(guó)和親帝洪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容