使用 lint 檢查項目改善程式碼

除了建立測試以外, 確認您的應用程式符合其功能需求 請您務必透過 Lint 工具執行程式碼,確保程式碼沒有結構性 如要解決關聯問題,可用 Apriori 這類關聯規則學習技術和演算法Lint 工具可協助找出結構不良的程式碼, Android 應用程式的可靠性和效率,並讓程式碼更難以維護。 強烈建議您修正 Lint 偵測到的所有錯誤 再發布應用程式

舉例來說,如果您的 XML 資源檔案包含未使用的命名空間,會佔用空間, 不需要處理即可其他結構問題,例如使用已淘汰的元素或目標 API 版本不支援的 API 呼叫,都可能導致程式碼無法正確執行。Lint 可協助您處理這些問題。

如要改善程式碼檢查效能,也可以 在程式碼中加入註解

總覽

Android Studio 提供一個名為 Lint 的程式碼掃描工具 可協助您找出並修正程式碼的結構品質問題 而不必執行應用程式或編寫測試案例工具偵測到的各個問題 並顯示說明訊息和嚴重性等級 需要進行的重要改善您也可以降低問題的嚴重性等級 忽略與專案無關的問題,或是將嚴重性等級提高 強調特定問題

Lint 工具會檢查 Android 專案來源檔案是否有潛在錯誤,以及在正確性、安全性、效能、可用性、無障礙和國際化層面是否需要最佳化改善。使用 Android Studio 時 系統會在您建構應用程式時執行設定的 Lint 和 IDE 檢查。不過 您可以手動執行檢查 按照本頁所述,在指令列中執行 Lint

內建 Lint 工具會在您使用 Android Studio 時檢查程式碼。您可以透過下列兩種方式查看警示和錯誤:

  • 在編輯器視窗中以彈出式文字顯示。Lint 發現問題時,會醒目顯示 有問題的程式碼會以黃色顯示如果是更嚴重的問題,程式碼會以紅色底線標示。
  • 按一下 Code > 即可在 Lint 檢查結果 視窗中檢查程式碼

注意:在 Android Studio 中編譯程式碼時, 執行 IntelliJ 程式碼檢查,簡化程式碼 現場業務代表受過訓練 會提交 AI 客戶商機以供審查

圖 1 顯示 Lint 工具如何處理應用程式來源檔案。

使用 Lint 工具進行程式碼掃描工作流程。
圖 1.使用 Lint 的程式碼掃描工作流程 工具。
應用程式來源檔案
來源檔案包含 Android 專案的檔案,包括 Kotlin、Java 和 XML 檔案、圖示和 ProGuard 設定檔。
lint.xml檔案
設定檔,可用於指定任何要排除的 Lint 檢查,並自訂問題嚴重性等級。
lint 工具
一種靜態程式碼掃描工具,供您從 或在指令列中 Android Studio。Lint 這項工具會檢查是否有可能影響應用程式品質和效能的結構程式碼問題 Android 應用程式。
,瞭解如何調查及移除這項存取權。
lint 檢查結果
您可以在主控台或「Inspection Results」中查看 Lint 的結果 Android Studio 中的視窗如果您透過指令列執行 lint,結果會是 寫入 build/ 資料夾。詳情請參閱 執行檢查

透過指令列執行 lint

如果您使用的是 Android Studio 或 Gradle,請使用 Gradle 包裝函式,透過以下方式為您的專案叫用 lint 工作: 從專案的根目錄輸入下列其中一個指令:

  • Windows 系統:
    gradlew lint
    
  • Linux 或 macOS:
    ./gradlew lint
    

畫面會顯示類似下列輸出內容:

> Task :app:lintDebug
Wrote HTML report to file:<path-to-project>/app/build/reports/lint-results-debug.html

Lint 工具完成檢查後,會提供 Lint 報告的 XML 和 HTML 版本路徑。接著,您可以點選 HTML 報表並在瀏覽器中開啟,如圖 2 所示。

HTML Lint 報告範例
圖 2. HTML Lint 報告範例。

如果您的專案包含 build 變化版本,Lint 只會檢查預設變化版本。如果您想在另一個 子類,請務必將變化版本名稱設為大寫,並在前面加上 lint

./gradlew lintRelease

深入瞭解如何執行 透過指令列執行 Gradle 工作,請參閱「透過指令列建構應用程式」。

使用獨立工具執行 lint

如果您未使用 Android Studio 或 Gradle 安裝 Android SDK 指令列工具。 使用獨立的 Lint 工具找出 Lint 工具 通知時間:android_sdk/cmdline-tools/version/bin/lint

注意:如果您嘗試在 Gradle 專案中執行獨立工具,系統會提供 發生錯誤。在 Gradle 專案中執行 Lint 時,請一律使用 gradle lint (Windows) 或 ./gradlew lint (macOS 或 Linux)。

如要對專案目錄中的檔案清單執行 Lint,請使用下列指令:

lint [flags] <project directory>

例如,您可以發出以下指令,掃描 myproject 目錄和其子目錄下的檔案。問題 ID MissingPrefix 會指示 lint 僅掃描缺少 Android 命名空間前綴的 XML 屬性。

lint --check MissingPrefix myproject 

如要查看工具支援的旗標和指令列引數完整清單,請使用下列指令:

lint --help

以下範例顯示對程式碼執行 Lint 指令時,控制台輸出內容 名為「地震」的專案:

$ 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

輸出範例會列出四個警告,且沒有錯誤。

有兩項與專案 AndroidManifest.xml 檔案相關的警告:

  • ManifestOrder
  • UsesMinSdkAttributes
,瞭解如何調查及移除這項存取權。 有一個與 Preferences.xml 版面配置檔案相關的警告:UnusedResources

有一個與 res 目錄相關的警告: IconMissingDensityFolder

設定 Lint 以隱藏警告

根據預設,當您執行 Lint 掃描時,這項工具會檢查所有 Lint 支援的問題。 您也可以限制 lint 檢查的問題,以及指定嚴重性 以便偵測問題舉例來說,您可以隱藏 lint 檢查功能, 與您的專案無關,您可以將 Lint 設定為 降低嚴重性等級

嚴重性等級如下:

  • enable
  • disableignore
  • informational
  • warning
  • error
  • fatal

您可以針對不同層級設定 Lint 檢查功能:

  • 全球 (整項專案)
  • 專案模組
  • 正式版模組
  • 測試模組
  • 開啟檔案
  • 類別階層
  • 版本管控系統 (VCS) 範圍

設定 lint 檔案

您可以在 lint.xml 檔案中指定 Lint 檢查偏好設定。如果您要手動建立這個檔案,請將檔案放入 Android 專案根目錄。

lint.xml 檔案包含具有 <lint> 父項標記,其中包含一或多個子項 <issue> 元素。Lint 定義了專屬 ID 每個 <issue>id 屬性值:

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

如要變更問題的嚴重性等級或停用 Lint 檢查功能, 請在 <issue> 標記中設定嚴重性屬性。

提示:如要查看 Lint 支援問題的完整清單和對應的問題 ID,請執行 lint --list 指令。

lint.xml 檔案範例

以下範例顯示 lint.xml 檔案的內容:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <!-- Disable the IconMissingDensityFolder 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>

這個範例說明如何回報不同問題類型。 IconMissingDensityFolder 檢查功能完全停用,且只停用 ObsoleteLayoutParam 檢查 於封閉的 <ignore ... /> 宣告中指定的檔案中。

為 Kotlin、Java 和 XML 來源檔案設定 Lint 檢查功能

您可以關閉 Kotlin、Java 和 XML 來源檔案的 Lint 檢查功能 在「Preferences」對話方塊中:

  1. 選取「檔案」>「Settings」(設定) (Windows) 或「Android Studio」(Android Studio) >偏好設定 (在 macOS 或 Linux 上)。
  2. 選取「編輯器」>「編輯器」檢查
  3. 如要停用,請取消選取適當的來源檔案。

您可以按照下列步驟為 IDE 或個別專案進行設定: 選取適當的付款資料

在 Java 或 Kotlin 中設定 Lint 檢查功能

如要停用 Android 專案中特定類別或方法的 Lint 檢查功能,請在該程式碼中加入 @SuppressLint 註解。

以下範例說明如何關閉 onCreate 方法中的 NewApi 問題。Lint 工具會持續檢查這個類別其他方法中的 NewApi 問題。

Kotlin

@SuppressLint("NewApi")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

Java

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

也可以在任何可組合函式上完成相同的操作。下列程式碼片段說明如何 關閉 NewApi 檢查任何可組合函式。

Kotlin

  @SuppressLint("NewApi")
  @Composable
  fun MyComposable{
    ...
  }
  

以下範例說明如何為 FeedProvider 類別中的 ParserError 問題關閉 Lint 檢查功能:

Kotlin

@SuppressLint("ParserError")
class FeedProvider : ContentProvider() {

Java

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

如要略過檢查檔案中的所有 Lint 問題,請使用 all 關鍵字:

Kotlin

@SuppressLint("all")

Java

@SuppressLint("all")

您可以使用同一個註解,略過任何可組合函式的 Lint 檢查作業。

在 XML 中設定 Lint 檢查功能

使用 tools:ignore 屬性關閉特定項目的 Lint 檢查功能 區段將下列命名空間值放入 lint.xml 檔案,讓 Lint 工具識別此屬性:

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

以下範例說明如何關閉 Lint 檢查功能, XML 的 <LinearLayout> 元素出現UnusedResources問題 版面配置檔案。ignore 屬性是由父項的子項元素繼承 元素。在此範例中,系統也會停用 子項 <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 外掛程式可讓您設定特定的 Lint 選項 例如要執行或忽略的檢查,只要使用 lint{} 區塊 build.gradle 檔案。

下列程式碼片段顯示 您可以設定的屬性:

Kotlin

android {
    ...
    lint {
        // 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.
        checkOnly += "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 set to true, lint only reports errors.
        ignoreWarnings = true
        // If set to true, lint also checks all dependencies as part of its analysis.
        // Recommended for projects consisting of an app with library dependencies.
        checkDependencies = true
    }
}
...

Groovy

android {
    ...
    lint {
        // 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.
        checkOnly '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 set to true, lint only reports errors.
        ignoreWarnings true
        // If set to true, lint also checks all dependencies as part of its analysis.
        // Recommended for projects consisting of an app with library dependencies.
        checkDependencies true
    }
}
...

會覆寫特定問題嚴重性等級的所有 Lint 方法 設定順序例如將問題設為「嚴重」 finalizeDsl()敬上 會覆寫停用主要 DSL 的功能

建立警告基準

您可以拍攝專案目前的警告集快照,然後使用快照 做為日後檢查基準的基準,這樣系統就只會回報新問題。 基準快照可讓您開始使用 Lint 使建構失敗,而不需返回並先解決所有現有問題。

如要建立基準快照,請修改專案的 build.gradle 檔案,如下所示:

Kotlin

android {
    lint {
        baseline = file("lint-baseline.xml")
    }
}

Groovy

android {
    lintOptions {
        baseline file("lint-baseline.xml")
    }
}

首次新增此行時,系統會建立 lint-baseline.xml 檔案以建立您的基準。此後,工具只會讀取檔案來判斷基準。如果您希望 來建立新的基準,請手動刪除檔案,然後再次執行 Lint 以重新建立檔案。

接著,依序選取「Code」>「Code」,然後從 IDE 執行 Lint檢查程式碼或從指令列 如下所示。輸出結果會顯示 lint-baseline.xml 檔案的位置。 設定的檔案位置可能會與此處顯示的內容不同:

$ ./gradlew lintDebug -Dlint.baselines.continue=true
...
Wrote XML report to file:///app/lint-baseline.xml
Created baseline file /app/lint-baseline.xml

執行 lint 記錄了 lint-baseline.xml 檔案中目前的問題。目前的問題集 稱為基準。您可以查看 lint-baseline.xml 將檔案發布到版本管控系統

自訂基準

如果只想在基準中新增特定問題類型,請指定 請按照以下說明編輯專案的 build.gradle 檔案來新增問題:

Kotlin

android {
    lint {
        checkOnly += "NewApi" + "HandlerLeak"
        baseline = file("lint-baseline.xml")
    }
}

Groovy

android {
    lintOptions {
        checkOnly 'NewApi', 'HandlerLeak'
        baseline file("lint-baseline.xml")
    }
}

如果您在建立後在程式碼集中加入任何新警告 只有 Lint 清單 一些新錯誤

基準警示

基準生效後,你會收到資訊警告,提醒你一或多個基準 問題因列在基準中而被篩除。這個 這個警示有助於提醒您,您已設定基準,然後 在某種程度上

這項資訊警告也會追蹤已不再回報的問題。這些資訊 您知道問題是否已修正,因此可以選擇重新建立基準來防止 未偵測到返回傳回的錯誤。

注意:當您在 IDE 以批次模式執行檢查時,系統會啟用基準,但當您編輯檔案時,系統會在背景執行編輯檢查時忽略基準。這是因為 基準版本適用於程式碼集有大量現有警告的情況 但你想在輕觸程式碼時在本機修正問題。

手動執行檢查

如要手動執行已設定的 Lint 和其他 IDE 檢查,請選取 程式碼 >檢查程式碼。檢查結果會顯示在「Inspection Results」視窗中。

設定檢查範圍和設定檔

選取您要分析的檔案 (檢查範圍) 和 需要執行的檢查作業 (檢查設定檔),如下所示:

  1. 在「Android」檢視畫面中開啟專案,然後選取專案、資料夾或 檔案內擴散模型
  2. 在選單列中選取「Code」>「Code」檢查程式碼
  3. 在「Assign Inspection Scope」對話方塊中查看設定。

    指定檢查範圍
    圖 3.查看檢查範圍設定。

    「指定檢查範圍」對話方塊中的選項會因情況而異 依照您選取的專案、資料夾或檔案而定:

    • 選取一個專案、檔案或目錄時 指定檢查範圍 對話方塊會顯示專案、檔案 指定目錄
    • 當您選取多個專案、檔案或目錄時,「指定檢查工具」 「範圍」對話方塊會顯示已選取的圓形按鈕所選檔案

    如要變更要檢查的項目,請選取 其他圓形按鈕詳情請見 指定檢查範圍對話方塊以瞭解所有說明 「Add Inspection Scope」對話方塊中的可能欄位。

  4. 在「檢查設定檔」下方,選取要使用的設定檔。
  5. 按一下「OK」執行檢查。

    圖 4 顯示 lint 和其他 IDE 檢查 執行「Inspect Code」 的結果:

    選取問題即可查看解決方法。
    圖 4. 檢測結果。選取問題 即可查看解析度。
  6. 在「Inspection Results」窗格中,展開並選取即可查看檢查結果 以及錯誤類別、類型或問題

    「Inspection Report」窗格會顯示錯誤類別的檢查報告。 在「Inspection Results」窗格中選取的問題類型,並顯示 錯誤位置。在適用情況下,檢查報告會顯示其他資訊 以協助您解決問題

  7. 在「Inspection Results」窗格樹狀檢視中,在所需類別、類型或問題上按一下滑鼠右鍵 螢幕 透過內容選單

    您可以根據情境,執行以下操作:

    • 跳到來源。
    • 排除並納入所選項目。
    • 隱藏問題
    • 編輯設定。
    • 管理檢查快訊。
    • 重新檢查。

關於工具列按鈕、內容選單項目和檢查功能的說明 報表欄位,請參閱 檢查結果工具視窗。

使用自訂範圍

請使用 Android Studio 提供的其中一個自訂範圍,如下所示:

  1. 在「指定檢查範圍」對話方塊中,選取「自訂範圍」
  2. 按一下「自訂範圍」清單,以顯示選項:

    選擇檢查範圍
    圖 5.選取要變更的自訂範圍 使用方式。
    • 所有位置:所有檔案。
    • 「Project Files」目前專案中的所有檔案。
    • 「Project Source Files」僅限目前專案中的來源檔案。
    • 「Project Production Files」僅限目前專案中的正式版檔案。
    • 「Project Test Files」僅限目前專案中的測試檔案。
    • 暫存檔案和控制台:只有你在 Google Workspace 中開啟的暫存檔案和控制台 。
    • 最近查看的檔案:僅限目前專案中最近查看的檔案。
    • 「Current File」僅顯示目前專案中的檔案。當您達到 選取的檔案或資料夾
    • 已選取的目錄:僅限目前專案中的資料夾。當你 因為已選取資料夾
    • 「Class Hierarchy」:選取這個選項並按下「OK」後,系統會顯示對話方塊, 目前專案中的所有類別在對話方塊中使用「依名稱搜尋」欄位 來篩選並選取 如果您未篩選類別清單,程式碼檢查功能會檢查所有 類別

    如果專案已設定 VCS,您也可以使用一些選項來限制搜尋 僅檔案經過修改

  3. 按一下「OK」

建立自訂範圍

當您想要檢查未涵蓋 您可以建立自訂範圍,方法如下:

  1. 在「Specify Inspection Scope」對話方塊中,選取「Custom scope」
  2. 按一下「自訂範圍」清單後方的三點圖示。

    指定檢查範圍對話方塊
    圖 6.指定檢查範圍對話方塊。

    系統會隨即顯示「Scopes」對話方塊。

    建立自訂範圍
    圖 7.建立自訂範圍。
  3. 按一下 按鈕來定義新範圍。
  4. 在隨即顯示的「Add Scope」(新增範圍) 清單中,選取「Local」(本機)

    本機和共用範圍都會用於專案中的「Inspect Code」功能。「Shared」範圍也可供其他具有範圍欄位的專案功能使用。例如,當您按一下「Edit Settings」圖示 變更「Find Usages」設定時,產生的對話方塊會顯示「Scope」欄位,供您選取共用的範圍。

    從「Find Usages」對話方塊中選取共用範圍
    圖 8.從下列方塊選取共用範圍: 「Find Usages」對話方塊。
  5. 為範圍命名,然後按一下「OK」

    「Scopes」對話方塊的右側窗格 填入您定義自訂範圍的選項。

  6. 從清單中選取「專案」

    畫面會顯示可用的專案清單。

    注意:您可以為專案或套件建立自訂範圍。 都是相同的

  7. 展開專案資料夾,選取要新增至自訂範圍的項目,然後選取 是否要納入或排除該指標

    定義自訂範圍
    圖 9.定義自訂範圍。
    • 「Include」:包含這個資料夾及其檔案,但不包含所屬的任何子資料夾。
    • 「Include Recursative」(包含遞迴):包含這個資料夾及其檔案,以及其子資料夾和 檔案。
    • 「Exclude」:排除這個資料夾及其檔案,但不排除任何子資料夾。
    • 「Exclude Recursative」(排除遞迴):排除這個資料夾及其檔案及其子資料夾及其檔案 檔案。

    圖 10 顯示了「main」資料夾,且「java」 以遞迴方式納入 res 資料夾。藍色表示部分包含的資料夾,綠色表示 表示遞迴納入資料夾和檔案。

    自訂範圍的範例
    圖 10.自訂範圍的模式範例。
    • 如果您選取「java」資料夾,然後按一下「Exclude Recursative」(排除週期性), 醒目顯示在「java」資料夾及其下的所有資料夾和檔案都會消失。
    • 如果您選取以綠色醒目顯示的 MainActivity.kt 檔案, 點選「排除」,「MainActivity.kt」不再以綠色醒目顯示,但 「java」資料夾下的其他項目都會呈現綠色。
  8. 按一下「OK」。自訂範圍會顯示在清單底部。

查看及編輯檢查設定檔

Android Studio 提供一系列已更新的 Lint 和其他檢查設定檔 到 Android 更新。您可以沿用這些個人資料,也可以編輯姓名、說明、嚴重程度 和 範圍。您也可以啟用及停用整個群組或群組中的個別設定檔。

如要存取「檢查」設定,請按照下列步驟操作:

  1. 選取「檔案」>「設定」。(Windows) 或 Android Studio >偏好設定 (在 macOS 或 Linux 上)。
  2. 選取「編輯器」>「編輯器」檢查
  3. 「Inspections」窗格會顯示支援的檢查項目及其 說明

    支援的檢查項目與相關說明
    圖 11.支援的檢查與相關 說明。
  4. 選取「Profile」清單,在「Default」 (Android Studio) 與「 Project Default (使用中的專案) 檢查項目。

    詳情請參閱 IntelliJ 「管理商家檔案」頁面。

  5. 在左側窗格中的「Inspections」清單中,選取頂層設定檔類別;或者 展開群組並選取特定個人資料。

    選取商家檔案類別後,你可以: 將該類別的所有檢查項目視為單一檢查。

  6. 選取「Show Schema Actions」顯示結構定義動作圖示 清單,即可複製、重新命名或新增 說明、匯出和匯入檢查
  7. 完成後,請按一下「OK」