自動化代碼檢查優化Lint

Lint

除了測試 Android 的應用程序是否滿足功能要求外,確定你的代碼沒有結構問題也相當重要。代碼架構不完善會影響 Android 應用程序的可靠性和運行效率,同時也會使代碼更難維護。比如, 如果你的 XML資源包含未使用的命名文件,這不僅佔用了空間,還會招致不必要的處理工作。其他的結構問題,如使用過時代碼,或者使用了不被目標 API 版本支持的 API 調用,這都 可能會導致代碼無法正確運行

概覽

Android Studio 提供了一款名叫 Lint 的代碼掃描工具,它可以幫助你輕鬆識別並糾正你的代碼結構質量問題,而且並不需要運行app或編寫測試用例。該工具檢查到的每個問題都會生成一份包含描述信息和嚴重等級的報告,因此你可以快速優先處理需要做的緊急改進。你還可以配置一個問題的嚴重程度以忽略與你項目不相關的問題,或提升嚴重級別。這個工具有一個命令行接口,因此你可以輕易將它集成到你的自動測試進程中。

Lint 工具爲 潛在的bug和優化改進會 檢查你的Android項目代碼文件中的正確性、安全性、性能、可用性、可訪問性以及國際化。你可以從命令行或Android Studio中運行Lint。

注意:在Android Studio中,當你的代碼在Android Studio中編譯時額外的 * IntelliJ code inspections * 會運行以簡化代碼審查。

下圖展示了Lint工具是如何處理應用程序的源代碼文件的。
這裏寫圖片描述

  1. 應用程序源代碼文件

  2. 源代碼文件包含了那些構成你的Android工程的文件,包括 Java 和 XML文件,圖標,以及 ProGuard 配置文件。

  3. lint.xml 文件

  4. 這是一個配置文件,你可以用它來指定任何你想要排除出去的Lint檢查,還有就是對問題的嚴重級別進行自定義。

  5. Lint 工具

  6. 這是一個靜態的代碼掃描工具,你可以通過命令行或者 Android Studio來把它運行起來。Lint 工具會檢查哪些可能會影響到Android應用程序質量及性能的結構方面的代碼問題。我們強烈建議你在發佈應用程序之前,先把Lint檢測出來的錯誤 修正 。

  7. Lint檢查的結果

  8. 你可以在控制檯或者 Android Studio 的事件日誌( Event Log ) 中查看來自Lint的運行結果。每一個問題都會以其在源代碼文件中檢測到錯誤的位置進行標識,並附上針對問題的描述信息。

Lint 工具是作爲 Android SDK工具版本16或者更高版本的一部分,已經自動被安裝好了的。

在 Android Studio 中運行Lint

在 Android Studio 中, 配置好的 Lint 及 IDE 檢查會在你構建應用時自動運行。IDE檢查是跟着 Lint 檢查一起配置的,運行 IntelliJ 代碼檢查 就可以精簡代碼的審查工作

注意:要查看和修改檢查的問題嚴重界別的話,可以使用 File > Settings > Editor > Inspections 菜單來打開檢查配置( Inspection Configuration )頁,裏面有一個支持檢查項的清單 。

使用 Android Studio 的話, 你還可以針對特定的構建變量運行 Lint 檢查, 或者也可以是來自 build.gradle 文件的所有變量。需要將 lintOptions 屬性添加到構建文件的 android 設置中。下面這段代碼來自於一個 Gradle 構建文件,它顯示瞭如何將 quiet 選項設置成 true,將 abortOnError 選項設置成 false

android {
    lintOptions {
       // set to true to turn off analysis progress reporting by lint
       quiet true
       // if true, stop the gradle build if errors are found
       abortOnError false
       // if true, only report errors
       ignoreWarnings true
       }
       ...
    }

要在 Android Studio 中手動運行檢查的話,可以從 application 或者 鼠標右鍵出現的菜單入手,選擇 Analyze > Inspect Code 就可以了。這樣會出現一個指定檢查範圍( Specify Inspections Scope )對話框 , 這樣你就可以指定想要進行檢查的範圍和方面了

每次檢查的結果都會顯示在檢查工具窗口中。你可以通過將鼠標懸停在一個檢查的錯誤上來顯示內聯的錯誤概要信息, 或者通過選定它來展示出錯誤完整的問題描述信息。

從命令行運行 lint

要針對一個工程目錄中一系列文件運行 Lint,可以使用如下命令

lint [flags] <project directory>

例如,你可以輸入如下命令來掃面 myproject 路徑及其子路徑下的文件。問題ID MissingPrefix 會告訴 Lint 只掃描那些丟失了 Android 命名空間前綴的 XML 屬性

lint --check MissingPrefix myproject

要查看工具所支持的標識和命令行參數清單,使用如下命令

lint --help

lint 輸出示例

下面的示例展示了 Lint在針對一個叫做 Earthquake 的工程運行時,控制檯的輸出

$ lint Earthquake

Scanning Earthquake: ...............................................................................................................................
Scanning Earthquake (Phase 2): .......
AndroidManifest.xml:23: Warning: <uses-sdk> tag appears after <application> tag [ManifestOrder]
  <uses-sdk android:minSdkVersion="7" />
  ^
AndroidManifest.xml:23: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion="?" [UsesMinSdkAttributes]
  <uses-sdk android:minSdkVersion="7" />
  ^
res/layout/preferences.xml: Warning: The resource R.layout.preferences appears to be unused [UnusedResources]
res: Warning: Missing density variation folders in res: drawable-xhdpi [IconMissingDensityFolder]
0 errors, 4 warnings

上面的輸出列明瞭這個工程有個四個警告,沒有錯誤。三處警告(ManifestOrder, UsesMinSdkAttributes, and UnusedResources)是在工程的 AndroidManifest.xml文件中找到的。剩下的這處警告(IconMissingDensityFolder)是在 Preferences.xml 佈局文件中找到的

對 lint 進行配置

默認情況下,當你運行 Lint 掃描時,工具會檢查所有 Lint 支持掃描的問題。你也可以限制 Lint 只對哪些問題進行檢查,並制定這些問題的嚴重級別。例如,你可以不讓 Lint 去檢查哪些跟你的工程沒多大關係的問題,還可以不讓 Lint 報告那些嚴重級別較低的不怎麼重要的問題

你可以在不同的級別上對 Lint 檢查進行配置:

  1. 全局地,針對整個工程

  2. 每個工程模塊

  3. 每個生產模塊

  4. 每個測試模塊

  5. 每個打開的文件

  6. 每個類層級

  7. 每個版本控制系統(VCS)範圍內

在 Android Studio 中對Lint進行配置

在你使用的是Android Studio時,其內置的 Lint 工具會對你的代碼進行檢查。你可以使用兩種方式來查看警告和錯誤信息:

  • 代碼編輯器中的一個彈出文本. 當 Lint 發現一處問題時,它會讓問題代碼顯示成高亮的黃色,或者針對更加嚴重的問題,讓代碼帶上紅色的下劃線。

  • 在你選擇 Analyze > Inspect Code 所打開的 Lint 檢查結果窗口中。

  • 要對默認的 Lint 檢查進行設置的話

    1. 在 Android Studio 中打開你的項目。

    2. 選擇 File > Other Settings > Default Settings。

    3. 在默認選項( Default Preferences )對話框中選擇 Editor > Inspections 。

    4. 在 Profile 區域選擇 Default 或者 Project Default 來設置 掃描範圍 是針對 Android Studio中的所有工程,或僅僅只針對對應的工程。

    5. 將一個類別展開,然後按需修改 Lint 設置。

    6. 你可以選擇單個檢查,或者整個所有的類別。

    7. 點擊 OK 。

  • 要製作一份 Lint 檢查的列表顯示在檢查結果 ( Inspection Results ) 窗口的話:

    1. 在 Android Studio 中打開你的工程並選擇工程中你想要進行測試那一部分。

    2. 選擇 Analyze > Inspect Code。

    3. 在指定檢查範圍( Specify Inspection Scope )對話框中,選擇要進行檢查的 範圍 和方面。

    4. 範圍會指定你想要分析的文件,而方面則是指定你想要執行的那些 Lint 檢查。

    5. 如果你想要對 Lint 設置進行修改的話,就點擊檢查(Inspections)對話框中的 …,選擇性的點擊 Manage 來定義一個新的方面,指定你自己所想的Lint設置,然後點擊 OK 。

    6. 在檢查( Inspections ) 對話框中,你可以進行字符串搜索來找到 Lint 檢查。注意在 檢查 窗口中如果修改了一個方面的 Lint設置,並不會改變上一個過程中所講到的默認設置。不過它確實改變了在 檢查 對話框中顯示的那些設置 。

    7. 點擊OK。

對 lint 文件進行配置

你可以在 lint.xml 文件中指定 Lint 檢查的參數。如果你是手動創建的這個文件,就把它放到Android工程的根路徑下面。如果你是在 Android Studio 中對 Lint 參數進行的配置的話,lint.xml已經自動爲你創建並添加到 Android 工程了

lint.xml 文件包含了一個封閉起來的父標記,裏面包含了一個或者多個 子元素。每個 被指定了一個唯一的id屬性值,它是由 Lint 來定義的。

<?xml version="1.0" encoding="UTF-8"?>    <lint>        <!-- list of issues to configure --></lint>

通過在 標記中的severity 進行設置,你可以不讓 Lint 對某個問題進行檢查,或者修改一個問題的嚴重等級。

提示:想要查看 Lint 工具所支持的問題的完整清單及其對應的問題ID的話,可以運行 lint –list 命令。

下面的示例顯示了一個 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 檢查

你可以在 Java 和 XML 文件中將 Lint 檢查禁用掉。

提示: 如果你使用的是 Android Studio 的話,你可以使用 File > Settings > Project Settings > Inspections 功能來管理對 Java 和XML 源代碼文件的 Lint 檢查。

在 Java 中配置 lint 檢查

要在 Android 工程中將針對一個 Java 類或者方法的 Lint 檢查禁用的話,向 Java 代碼添加 @SuppressLint 註解就行了。

下面的示例展示了你如何才能夠將 onCreate 方法中針對 NewApi 問題的 Lint 檢查關閉掉。Lint 工具還是會在這個類的其它方法中對 NewApi 問題進行檢查。

@SuppressLint("NewApi")@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);

下面的示例顯示瞭如何去關閉針對 FeedProvider類中的 ParserError 問題的 Lint 檢查:

@SuppressLint("ParserError")public class FeedProvider extends ContentProvider {

要限制在 Java 文件中針對所有 Lint 問題的檢查,可以像下面這樣使用 all 關鍵詞:

@SuppressLint("all")

在 XML 配置 lint 檢查

你可以使用 tools:ignore 屬性將針對 XML 文件特定區域的 Lint 檢查禁用掉。爲了讓 Lint 工具認出這個屬性,如下所示的命名空間必須被引入到你的 XML 文件中:

namespace xmlns:tools="http://schemas.android.com/tools"

下面的示例展示了你如何才能夠將針對一個 XML 佈局文件中的 元素的 UnusedResources 問題的 Lint 檢查禁用掉。ignore 屬性會由在其中聲明瞭該屬性的父元素其下的子元素所繼承。在這個實例中,對於子元素 而言, Lint 檢查也是被禁用的。

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