效能優化工具知識梳理(8) Lint

澤毛發表於2017-12-21

一、概述

LintAndroid Studio中提供的程式碼分析工具,它能夠檢查出程式碼當中存在的問題,定義該問題的嚴重程度,並給出相應的解決方案,這樣我們就可以快速地定位和修復問題。 整個lint檢查的架構如下圖所示:

效能優化工具知識梳理(8)   Lint
從圖中來看它包含以下幾個元件:

  • App Source Files:對應於我們工程當中的原始檔,包括Java程式碼、XML檔案、Icons圖片、ProGuard configuration files
  • lint.xml:定義了需要檢查的問題,以及該問題對應的等級。
  • lint tool:靜態的程式碼掃描工具,我們可以從命令列或者Android Studio中啟動,它會根據lint.xml中定義的規則,來檢查App Source Files中的程式碼。
  • lint檢查結果:把lint tool檢測出的問題分為不同的類別,方便開發者修復,目前問題分為以下幾類:
    效能優化工具知識梳理(8)   Lint

下面,我們就分以下幾部分來介紹lint的使用:

  • 定義lint檢查的範圍
  • 如何使用lint
  • 使用lint檢查無用資源
  • Gradle配置

二、Lint使用

2.1 Lint配置

File -> Settings,在其中搜尋lint,可以得到如下的介面:

效能優化工具知識梳理(8)   Lint
通過這個介面,我們可以配置在開發的過程中需要檢測哪些問題,以及這些問題所對應的嚴重程度。 當我們配置完成之後,將它儲存為一個新的Profile,同時可以將這個配置檔案匯出用於之後的專案:
效能優化工具知識梳理(8)   Lint
它會儲存成為xml檔案,假如我們相對於預設的配置有所修改,那麼會在檔案中新增一條記錄:
效能優化工具知識梳理(8)   Lint

2.2 使用Lint

2.2.1 配置檢查的範圍

使用Lint的步驟如下: 第一步:點選Analyze -> Inspect Code,之後,會彈出下面的介面:

效能優化工具知識梳理(8)   Lint
上半部分是定義需要檢查的範圍:

  • Whole Project:整個工程
  • Module Browser-Browser:當前我們所處的模組
  • File xxx:某個檔案
  • Custom Space:自定義的範圍,下拉選單中一般包括:
  • Project Files:所有專案檔案
  • Project Production Files:專案的程式碼檔案
  • Project Test Files:專案的測試檔案
  • OpenFiles:當前開啟的檔案
  • Module xx:某個模組
  • Current File:當前檔案

點選右邊的……,可以定義自己的Scope

效能優化工具知識梳理(8)   Lint
在這裡,我們可以選擇需要分析的檔案。

2.2.2 結果分析

我們在上面選擇對整個專案進行分析,之後會在下面得到分析的結果:

效能優化工具知識梳理(8)   Lint

  • 區域的最左邊提供了一組操作,我們可以通過它來改變結果展現的形式
  • 區域的中心列出了檢查的問題,當我們點選某條分析結果之後,會在右邊展現更為具體的資訊
  • 區域的右邊列出了分析的具體資訊
  • Name:檔名
  • Location:檔案所處位置
  • Problem synopsis :問題的具體描述,通常會給出解決的方法
  • Problen resolution:提供了一些快速修復問題的途徑,只需要點一下連結,就會執行它所描述的操作。
  • Suppress:如果想要忽略這條錯誤,那麼需要怎麼做。

2.3 只分析某個具體的問題

在上面的操作當中,我們是分析了所有的問題,有時候,我們只想處理某一方面的問題,那麼可以通過另一個入口來分析,Analyze -> Run inspection by name,之後會彈出一個視窗,然我們選擇需要檢查的問題型別:

效能優化工具知識梳理(8)   Lint
選擇好之後,點回車,那麼就會彈出和2.2一樣的選擇檢查檔案範圍的視窗:
效能優化工具知識梳理(8)   Lint
假如我們選擇了Unused resources,那麼最後的結果是這樣的,我們只會看到和這個問題相關的程式碼:
效能優化工具知識梳理(8)   Lint

三、使用lint刪除無用資原始檔

在經過一段時間的開發之後,我們專案中難免會出現無用的資原始檔,而Lint就提供了很好的方式,平常,我們對於資源的無效引用方式主要有以下幾種:

3.1 drawable在任何地方都沒有用到

這種方式很好理解,Lint一定會為我們檢查出來

3.2 drawable僅僅被style.xml引用,但是style沒有被Java程式碼,或者xml檔案引用:

效能優化工具知識梳理(8)   Lint
此時檢測的結果為styledrawable沒有被引用:
效能優化工具知識梳理(8)   Lint

3.3 drawablestyle.xml引用,style又被layout引用,但是layout沒有被引用:

效能優化工具知識梳理(8)   Lint
此時檢測的結果為layoutdrawablestyle沒有被引用
效能優化工具知識梳理(8)   Lint

3.4 前面和3.3相同,但是layoutJava程式碼所引用,而Java程式碼沒有被引用:

效能優化工具知識梳理(8)   Lint
這種情況,只通過Unused resources是檢測不出來的,
效能優化工具知識梳理(8)   Lint
這時候,就需要用到另外一個分類,Unused declaration,此時的檢測結果為:
效能優化工具知識梳理(8)   Lint
我們在上面點選右鍵,然後選擇Safe delete就可以刪除這個類了。

3.5 小結

通過Unused declarationUnused resources結合,就可以刪除我們大多數無用的資源,而小部分由於程式碼引用到,但是因為業務邏輯變了,導致不可能走到那一路的邏輯這種情況,就只能通過開發者自己處理了。

四、使用gradle構建時的配置

當我們使用Gradle構建時,可以通過lintoptions配置選項,並定義是否需要停止編譯,強制讓開發者處理較為嚴重的問題,這些選項如下表:

android {
    lintOptions {
        // true--關閉lint報告的分析進度
        quiet true
        // true--錯誤發生後停止gradle構建
        abortOnError false
        // true--只報告error
        ignoreWarnings true
        // true--忽略有錯誤的檔案的全/絕對路徑(預設是true)
        //absolutePaths true
        // true--檢查所有問題點,包含其他預設關閉項
        checkAllWarnings true
        // true--所有warning當做error
        warningsAsErrors true
        // 關閉指定問題檢查
        disable 'TypographyFractions','TypographyQuotes'
        // 開啟指定問題檢查
        enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
        // 僅檢查指定問題
        check 'NewApi', 'InlinedApi'
        // true--error輸出檔案不包含原始碼行號
        noLines true
        // true--顯示錯誤的所有發生位置,不擷取
        showAll true
        // 回退lint設定(預設規則)
        lintConfig file("default-lint.xml")
        // true--生成txt格式報告(預設false)
        textReport true
        // 重定向輸出;可以是檔案或'stdout'
        textOutput 'stdout'
        // true--生成XML格式報告
        xmlReport false
        // 指定xml報告文件(預設lint-results.xml)
        xmlOutput file("lint-report.xml")
        // true--生成HTML報告(帶問題解釋,原始碼位置,等)
        htmlReport true
        // html報告可選路徑(構建器預設是lint-results.html )
        htmlOutput file("lint-report.html")
        //  true--所有正式版構建執行規則生成崩潰的lint檢查,如果有崩潰問題將停止構建
        checkReleaseBuilds true
        // 在釋出版本編譯時檢查(即使不包含lint目標),指定問題的規則生成崩潰
        fatal 'NewApi', 'InlineApi'
        // 指定問題的規則生成錯誤
        error 'Wakelock', 'TextViewEdits'
        // 指定問題的規則生成警告
        warning 'ResourceAsColor'
        // 忽略指定問題的規則(同關閉檢查)
        ignore 'TypographyQuotes'
    }
}
複製程式碼

五、總結

通過lint能在編寫程式碼的過程中,實時地發現一些問題,這不僅有利於提高應用的質量,我們還可以通過lint提供的提示來了解到怎麼樣編寫高效的程式碼。

六、參考文獻

1.http://blog.csdn.net/lihenair/article/details/50915441 2.http://hubingforever.blog.163.com/blog/static/17104057920121069261691/ 3.http://www.jianshu.com/p/74a50b770816


更多文章,歡迎訪問我的 Android 知識梳理系列:

相關文章