Android工具:被你忽視的Lint

一、Lint簡介

1.Android Studio提供了一個代碼掃描工具被稱爲lint,它能幫助你在沒有執行應用或者編寫測試用例的情況下,幫助你識別和改正代碼結構質量問題;
2.每個被工具檢測出來的問題使用一個描述信息和安全級別報告,所以你能快速區分出需要優先執行改進。你可以降低問題的安全級別來忽略和你的項目不相關的問題,或者提高安全級別來突出某個問題;
注意:當你的代碼在Android Studio中編譯的時候,額外運行IntelliJ code inspections精簡的代碼檢查;
下圖展示了lint工具如何處理應用程序的源代碼文件;

  應用源代碼文件:源碼文件由你的Android項目文件組成,包含Java和XML文件,圖標和Proguard配置文件;
  lint.xml文件:一個你可以用來指定任何想執行的Lint檢查和自定義問題的安全級別的配置文件;
  lint工具:一個靜態代碼掃描工具,無論從命令行或者Andorid Studio中都可以在你的Android項目中運行。lint工具檢查可能影響你的Android程序質量和性能的代碼結構問題。強烈建議你在發佈你的應用之前,修改任何lint檢測出來的問題。
  lint檢測結果:你可以在控制檯或者Android Studio的Inspection Result窗口查看到lint檢測的結果;
二、在命令行執行lint
在一個項目目錄下運行lint檢查一系列文件,使用下面的命令:

lint [flags] <project directory>
例如,你可以執行下面的命令,來掃描項目目錄下和它的子目錄下的文件。MissingPrefix問題ID告訴lint只掃描缺少Android命名空間前綴的XML屬性
lint --check MissingPrefix myproject
提示:Error: No .class files were found in project "1.6-SNAPSHOT", so none of the classfile based checks could be run. Does the project need to be built first? [LintError]
處理:在Android Studio的項目中,會出現類似錯誤,可以嘗試使用gradle執行;

查看工具支持的全部flag列表和命令行參數,使用下面的命令:
C:\Users\chengxiang.peng.QUNARSERVERS\QAndroidSources\QAndroid>lint --help
Usage: lint [flags] <project directories>
Flags:
--help                   This message.
--help <topic>           Help on the given topic, such as "suppress".
--list                   List the available issue id's and exit.
--version                Output version information and exit.
--exitcode               Set the exit code to 1 if errors are found.
--show                   List available issues along with full explanations.
... .... 
5                        Invalid command-line argument.
使用Gradle運行Lint
如果你的項目包含build variant,你可以使用Gradle wrapper來調用你所有variant的lint task,在你的項目根目錄下輸入如下命令:
C:\Users\chengxiang.peng.QUNARSERVERS\QAndroidSources\QAndroid>gradlew lint
Incremental java compilation is an incubating feature.                          
DEBUG BUILD                                                      
mavenUser or mavenPassword is missing                                                    
:common:preDebugUnitTestBuild UP-TO-DATE
... ...
:ui:compileDebugJavaWithJavac UP-TO-DATE
:ui:lint                 
Ran lint on variant release: 10 issues found
Ran lint on variant debug: 10 issues found
Wrote HTML report to file:///C:/Users/chengxiang.peng.QUNARSERVERS/QAndroidSources/QAndroid/ui/build/outputs/lint-results-debug.html
Wrote XML report to file:///C:/Users/chengxiang.peng.QUNARSERVERS/QAndroidSources/QAndroid/ui/build/outputs/lint-results-debug.xml
BUILD SUCCESSFUL

如果你只想爲特定的build variant運行Lint任務,你必須使用lint作爲前綴拼寫variant的名字;
gradlew lintDebug
當lint工具完成它的檢查時,lint報告提供了XML和HTML版本報告的兩個路徑;
三、配置lint
當你運行一個lint掃描,默認情況下工具會檢查lint支持的所有問題。你也可以限制lint檢查的問題,爲這些問題分配嚴重程度。例如,你可以禁止和你的項目不相關的特定檢查,也可以配置lint非關鍵性問題報告低的安全級別。
你可以配置不同級別的lint檢查:
  1.全局(整個項目)
  2.項目模塊
  3.生產模塊
  4.測試模塊
  5.打開的文件
  6.類層次結構
  7.版本控制系統(VCS)範圍
在Android Studio中配置Lint
當你使用Andorid Studio的時候,內置的Lint工具會檢查你的代碼。你可以從以下兩方面查看警告和錯誤:
  1.在代碼編輯器中以彈出文本的形式。當Lint發現一個問題,它會使用黃色突出有問題的代碼,對於更嚴重的問題,它會在代碼下面畫紅線;
  2.你點擊Analyze>Inspect Code後,在Lint的Inspection Results窗口中;
Lint配置文件
你可以在lint.xml文件中指定你的lint檢測配置。如果你手動創建這個文件,將它放在你Android項目的根目錄下。
lint.xml文件由一個封閉的<lint>父標籤組成,它包含了一個或者多個<issue>子標籤。Lint爲每一個<issue>定義了唯一的id屬性值;
<?xml version="1.0" encoding="UTF-8"?>
    <lint>
        <!-- list of issues to configure -->
</lint>
通過設置<issue>標識的安全屬性,你可以改變一個問題的安全級別,或者這個問題的lint檢查。
提示:查看lint支持的完整問題列表,和它們相關的問題ID,執行lint --list命令;
lint.xml文件實例,下面的例子展示了一個lint.xml文件的內容。
<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <!-- Disable the given check in this project -->
    <issue id="IconMissingDensityFolder" severity="ignore" />
    <!-- Ignore the ObsoleteLayoutParam issue in the specified files -->
    <issue id="ObsoleteLayoutParam">
        <ignore path="res/layout/activation.xml" />
        <ignore path="res/layout-xlarge/activation.xml" />
    </issue>
    <!-- Ignore the UselessLeaf issue in the specified file -->
    <issue id="UselessLeaf">
        <ignore path="res/layout/main.xml" />
    </issue>
    <!-- Change the severity of hardcoded strings to "error" -->
    <issue id="HardcodedText" severity="error" />
</lint>
爲Java和XML資源文件配置Lint檢查
你可以禁止Lint檢查你的Java和XML文件;
提示:在Default Preferences對話框中你可以管理你的Java或者XML文件的檢查功能。選擇File->Other Settings>DefaultSettings,然後在Default Preferencts對話框的左邊面板,選擇Editor>Inspections;
在Java中配置Lint檢查

爲了在你的Android項目中禁止Lint檢查某個指定的Java類或者方法,在這些Java代碼中添加@SuppressLint註解;
下面的例子展示了你如何在onCreate方法中關閉Lint的NewAPI問題檢查。在這個類的其它方法中Lint繼續檢查NewApi問題;
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
下面的例子展示瞭如何在FeedProvider類中關閉ParserError問題檢查;
@SuppressLint("ParserError")
public class FeedProvider extends ContentProvider {
抑制在Java文件中的所有lint問題檢查,使用all關鍵字,如下:
@SuppressLint("all")
在XML中配置Lint檢查
你可以使用tools:ignore屬性來禁止Lint對你的XML文件指定部分進行檢查。在lint.xml文件中加入下面的命名空間,Lint工具才能識別這些屬性;
namespace xmlns:tools="http://schemas.android.com/tools"
下面的例子向你展示瞭如何禁止Lint檢查一個XML佈局文件中的<LinearyLayout>元素的UnusedResources問題。在父元素中聲明的ignore屬性被子元素繼承。在這個例子中,Lint檢查也被禁止用於子<TextView>元素;
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="UnusedResources" >
    <TextView
        android:text="@string/auto_update_prompt" />
</LinearLayout>
爲了禁止多個問題,使用逗號分隔的字符串列出要禁止的問題。如下:
tools:ignore="NewApi,StringFormatInvalid"
爲了在XML元素中抑制所有的lint問題檢查,使用all關鍵字,如下:
tools:ignore="all"
四、在Gradle中配置lint選項
Gradle的Android插件允許你在你模塊級別的build.gradle文件中,使用lintOption{}塊配置一些lint選項,例如執行或者忽略什麼檢查。下面的代碼片段向你展示了你可以配置的一些屬性;
android {
  ...
  lintOptions {
    // Turns off checks for the issue IDs you specify.
    disable 'TypographyFractions','TypographyQuotes'
    // Turns on checks for the issue IDs you specify. These checks are in
    // addition to the default lint checks.
    enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
    // To enable checks for only a subset of issue IDs and ignore all others,
    // list the issue IDs with the 'check' property instead. This property overrides
    // any issue IDs you enable or disable using the properties above.
    check 'NewApi', 'InlinedApi'
    // If set to true, turns off analysis progress reporting by lint.
    quiet true
    // if set to true (default), stops the build if errors are found.
    abortOnError false
    // if true, only report errors.
    ignoreWarnings true
  }
}
...
五、手動運行檢測
通過選擇Inspect Code>Analyze,你可以手動運行配置的Lint和其它IDE檢查。檢查的結果會現在是Inspection Results窗口;
設置檢查範圍和配置
選擇你想分析的文件(檢查範圍)和你想運行的檢查(檢查配置),如下:
1.在Android視圖,打開你的項目,選擇你想分析的一個文件夾或者一個文件;
2.從菜單欄,選擇Analyze>Inspect Code;
3.在Spectify Inspection Scope對話框,查看設置;

顯示在Spectify Inspection Scope對話框的選項組合區取決於是否你選擇了一個項目,文件夾或者文件。你可以通過選擇其它的單選按鈕來改變你想檢查的文件。查看Spectify Inspection Scope對話框中所有可選項的說明;
  當你選擇一個項目,文件或者目錄,Specity Sinpection Scope對話框顯示你選擇的項目,文件或者目錄的路徑;
  當你選擇超過一個項目,文件,或者目錄,Specity Inspection Scope對話框顯示爲你選中的文件顯示一個選中的單選按鈕;
4.在Inspection profile,保留默認的Profile(Project Profile);
5.點擊OK來運行檢查,下面展示了從Inspect Code運行後lint和其它IED的檢查結果;

6.在左邊的面板樹視圖中,通過展開和選擇錯誤類型,類別和問題來查看檢查的結果;
右邊面板顯示了選中的錯誤類型,類別和文件的檢查報告,提供了錯誤的名字和位置。在適當的地方,檢查報告展示瞭如問題摘要等其它信息來幫助你修改問題;
7.在左邊面板樹視圖,右鍵單擊類型,類別和問題來顯示上下文菜單;
基於上下文,你可以執行所有或者一些如下操作:跳轉到源碼,排除和包含選中的選項,抑制問題,編輯設置,管理檢查警告,和重新運行檢查;
使用一個自定義的範圍
你可以使用Android Studio提供的Custom Scope,如下:
1.在Specify Inspection Scope對話框,點擊Custom scope;
2.點擊Custom scope下拉列表會顯示你的選項;

  Project Files:所有在當前項目中的文件;
  Project Production Files:在當前項目中的生產文件;
  Project Test Files:在當前項目中的測試文件;
  Open Files:在當前項目中打開的文件;
  Module<your-module>:在當前項目中對應的模塊中的文件;
  Current File:在你的項目中的當前文件。當你有一個文件或者文件夾被選中的時候出現;
  Class Hierarchy:當你選擇它點擊OK,一個展示當前項目所有類的對話框顯示。使用對話框中的Search by Name選項,來過濾和選擇檢查的類。如果你沒有過濾類列表,代碼檢查所有的類;
3.點擊OK按鈕;
創建一個自定義的範圍
當你想檢查的文件和目錄,在當前可用的自定義範圍都無法包含的時候,你可以創建一個Custom Scope。
1.在Specify Inspection Scope對話框,選擇Custom scope;
2.點擊Custom Scope下拉列表後面的"三個點"按鈕,Scopes對話框就顯示出來;
3.點擊Add+定義一個新的範圍;
4.在Add Scope下來列表中,選擇Local;
5.給這個Scope命名,並點擊OK;
local和shared Scope都能被用於項目的Inspect Code功能。Shared Scope也能被用於其它擁有Scope屬性的項目功能。例如,當你點擊Edit Settings來改變Find Usages設置,結果對話框中有一個Scope區域你可以來選擇Shared Scope;
6.從下拉列表中,選擇Project,有效的項目列表顯示在下面;
7.展開項目文件夾,選擇你想添加到自定義範圍的,點擊右邊的一個按鈕;

  Include:包含這個文件夾和它的文件,但是不包含任何它的子文件夾;
  Include Recursively:包含這個文件夾和所有它的文件,和子文件和它們的文件;
  Exclude:不包含這個文件夾和它的文件,但是不包含任何它的子文件夾;
  Exclude Resursively:不包含這個文件夾和所有它的文件,和子文件和它們的文件;
如果你選擇文件夾,點擊Exclude Recursively,這個文件夾以及所有子文件夾和文件變爲綠色;
如果你選擇文件夾下綠色的文件,點擊Exclude,文件不在爲綠色,但是文件下的其它所有文件還是綠色的;
8.點擊OK,自定義的範圍展現在下拉列表中;
查看和編輯檢查配置
Android Studio附帶有Lint,其它檢測文件通過Android更新來更新。你可以使用這些配置,或者編輯它們的名字,描述,嚴重程度和範圍。你也可以激活或者停用整個配置組或這個一個組內的單個配置。
打開Inspections對話框:
1.選擇Analyze>Inspect Code;
2.在Spectify Code對話框在Inspection Profile下,點擊More;

Inpections對話框展示一個支持的檢查和它們的描述列表;
3.選擇Profile下拉列表在Default(Android Studio)和Project Default(活動項目)檢查之間切換。
4.在Inspections對話框左面板,選擇一個頂級配置類型,或者展開一個組選擇一個配置。當你選擇一個配置類別,你可以作爲一個單獨的檢查來編輯所有的檢查;
5.選擇Manage下來列表來複制,重命名,和添加說明,導出和導入檢查;
6.當你完成的時候,點擊OK;
六、實踐總結

在實際開發過程中,lint可以大大的幫助我們提高代碼質量。針對新項目開始就引入該檢查是比較理想的情況,但是針對於大多數已經比較成熟(或者說比較“爛 ”)的項目而言,Lint的檢查規則應該根據自己項目的實際情況由少到多,有簡到嚴。
下面就列舉了一些,實際項目過程中常見的代碼結構問題:
Imports
  Unused import:刪除,減少不必要代碼
  
Verbose or redundant code constructs
  Redundant array creation:不定長參數不傳值
  
  Redundant type cast:本身就是該類型,不需要轉換
  
XML
  Deprecated API usage in XML:使用標識,避免lint警告
  
  Unused XML schema declaration

    Namespace declaration is never used:刪除,避免xml解析成本
    
  XML tag empty body:修改爲<../>形式,消耗樹內存,增加遍歷節點性能;
  


新技術,新未來!歡迎大家關注“1024工場”微信服務號,時刻關注我們的最新的技術訊息!(甭客氣!盡情的掃描或者長按!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章