Android-Lint工具使用

公司的項目之前是幾乎是純原生開發,后來因業務需求變更過于頻繁,加上原生開發成本較高,后來采用了混合開發模式,絕大部分頁面采用了H5頁面,因此之前使用的資源文件(包括圖片,xml文件等)大部分被閑置。近段時間,項目成立了專門的優化工作組,清理無用資源,壓縮apk體積也被納入此次優化工作范圍。在做資源清理的時候無可避免的用到了Android-Lint,本文主要講述Android-Lint的使用以及使用中的一些注意事項。
Android-Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通過代碼檢查,可發現潛在的問題,并能對Android程序進行優化處理。在AndroidStudio中已經集成了該工具,下面直接演示使用方法。

如圖,在頂部菜單欄找到Analyze選項,在彈框中選中Inspect Code,或者對項目根雙擊彈出菜單彈框(windows下右鍵項目根目錄),找到Analyze選項再選中Inspect Code選項,可以見到下圖對話框

選中whole project,然后直接選擇OK按鈕,你會見到以下進度條

靜靜地等待,等待時間由你的項目大小和你的機器性能有關,檢查完畢后會彈出Inspection的控制臺

如圖所示,看著你可能會一臉懵逼了(點擊每一項進去還有一大堆子項,你可能會直接暈菜),不過不用急,下面來簡單解釋以下以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
  1. Correctness:Messeges
  1. MissingTranslation
    字符串國際化不完全
  2. ExtraTranslation
    國際化的字符串,在默認位置(defaultlocale),沒有定義
  1. Security
  1. SetJavaScriptEnabled
    不確定你的程序中確實需要JavaScript就不要執行SetJavaScriptEnabled。
    2)ExportedContentProvider/ExportedReceiver/ExportedService/ExportedActivity
    ContentProvider/Receiver/Service/Activity的exported為true時,設置一個Permission,讓使用者獲取了Permission才能使用。
  2. HardcodedDebugMode
    不要在manifest中設置android:debuggable。
    設置它,編譯的任何版本都要采用指定的debug模式。不設置,編譯Eng版本采用debug模式;編譯User版本采用release模式。
    ***4. Performance ***
    **1) DrawAllocation **
    **避免在繪制或者解析布局(draw/layout)時分配對象。E.g.,Ondraw()中實例化Paint對象。 **
  3. ObsoleteLayoutParam
    Layout中無用的參數。
  4. 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 ***
    ***未被使用的資源會是程序變大,并且編譯速度降低。 ***********
  8. Overdraw
    如果為RootView指定一個背景Drawable,會先用Theme的背景繪制一遍,然后才用指定的背景,這就是所謂的“Overdraw”。
    可以設置theme的background為null來避免。
  9. UselessLeaf/UselessParent
    View或view的父親沒有用
    11)Handler Reference leaks
    handler可能導致的內存泄漏
  1. Usability:Typography
  1. TypographyDashes
    特殊字符需用編碼代替:“–”需要用“–”;“—”需要用“—”
  2. TypographyEllipsis
    特殊字符需用編碼代替:“…”需要用“…”
  3. TypographyOther
    問題:“(c)”需要用“?”
  1. Usability:Icons
  1. IconNoDpi
    Icon在nodpi和指定dpi的目錄下都出現。
  2. GifUsage
    Image不要用GIF,最好用PNG,可以用JPG。
  1. Usability
  1. BackButton
    Android中不要設計有Back的按鈕,Android中一般有Back的硬按鍵。
  2. ButtonCase
    Button的“Ok”/“Cancel”顯示大小寫一定,不要全大寫或全小寫。有標準的資源的字符串,不要自己再定義,而要用系統定義的:@android:string/ok和@android:string/cancel
  1. Accessibility
  1. ContentDescription
    ImageView和ImageButton應該提供contentDescription
  1. Internationalization
  1. HardcodeText
    硬編碼的字符串應該在資源里定義
  2. EnforceUTF8
    所有XML資源文件都應該以UTF-8編碼

不必把所有選項的意義都熟稔于心,這些東西網上,下面著重看加粗標記的項目

***UnusedResources ***是我此次代碼檢查的目的,檢測顯示我的項目中有1000多item是未被使用的,選中其中一個xml文件

發現有個Remove All Unused Resources的選項,大喜過望,感覺這項工作so easy,馬上點擊,運行完畢,clean一下,臥槽,報錯,為什么。。。
檢查報錯代碼,發現是內部的安全鍵盤sdk找不到指定id,真是神奇了,不是說好的無用資源嗎?為什么會報錯。突然發現,安全鍵盤對資源文件的調用采用了反射的模式去調用,因為需要它作為一個sdk打包成了jar包,jar包中只包含了它的src中的代碼文件,資源文件也沒有打包,認識直接放到宿主項目的相應文件夾下,使用的時候采用反射的模式進行調用。此時恍然大悟,lint工具會將沒有被直接引用的東西都標記成了無用的。這應該也算是它的一個坑吧。想過先全部清理,然后在把sdk的資源文件放回原位,但是檢查發現還有好幾個早期的內部sdk采用了將資源文件直接放到宿主項目的相應文件夾的做法,難度較大,而且這種隱蔽的東西很難控制,最后只能一個個去刪除,但也只是刪除了一部分,做不到徹底刪除。不過lint工具還是提供了很好的參考。最后將原本將近5M的資源文件刪至3.5M左右,再清理掉一些無用的jar包和so庫,左右將apk的體積壓縮了大概8M左右。
上面還有一個值得注意的地方就是Handler Reference leaks,即是handler可能導致的內存泄漏。可能是項目早期缺乏考慮,加上很多代碼是外包人員編寫,或許是責任心不夠強,項目中使用的handler大部分是內部類,當使用內部類(包括匿名類)來創建Handler的時候,Handler對象會隱式地持有一個外部類對象(通常是一個Activity)的引用(不然你怎么可能通過Handler來操作Activity中的View?)。而Handler通常會伴隨著一個耗時的后臺線程(例如從網絡拉取圖片)一起出現,這個后臺線程在任務執行完畢(例如圖片下載完畢)之后,通過消息機制通知Handler,然后Handler把圖片更新到界面。然而,如果用戶在網絡請求過程中關閉了Activity,正常情況下,Activity不再被使用,它就有可能在GC檢查時被回收掉,但由于這時線程尚未執行完,而該線程持有Handler的引用(不然它怎么發消息給Handler?),這個Handler又持有Activity的引用,就導致該Activity無法被回收(即內存泄露),直到網絡請求結束(例如圖片下載完畢)。另外,如果你執行了Handler的postDelayed()方法,該方法會將你的Handler裝入一個Message,并把這條Message推到MessageQueue中,那么在你設定的delay到達之前,會有一條MessageQueue -> Message -> Handler -> Activity的鏈,導致你的Activity被持有引用而無法被回收。這個問題也是較常見的可能導致內存泄漏的問題,解決方法一般是通過弱引用持有對Activity的引用,具體的實現方式自行百度或者google吧。最后順手點個贊,再順便掃掃碼關注我的公眾號(原諒我的不知足。。。),所有文章都會在公眾號發布。
?

掃一掃或者微信搜索AndroidHouse關注Android小黑屋

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容