除了建立測試確保應用程式符合功能要求之外,您還必須透過 lint 執行程式碼,確保程式碼沒有任何結構問題。Lint 工具可協助您找出結構不良的程式碼,這類程式碼會影響 Android 應用程式的可靠性和效率,並讓程式碼難以維護。
例如,如果您的 XML 資源檔案包含未使用的命名空間,不但佔用磁碟容量,您還需要浪費精力處理。其他結構問題,例如使用已淘汰的元素或目標 API 版本不支援的 API 呼叫,都可能導致程式碼無法正確執行。Lint 可協助您處理這些問題。
如要進一步提高程式碼檢查效能,建議您在程式碼中添加註解。
總覽
Android Studio 提供一款名為 lint 的程式碼掃描工具,可協助您找出並修正程式碼結構品質的問題,而不必執行應用程式或撰寫測試案例。這項工具會偵測每個問題,並提供說明訊息和嚴重性等級,方便您快速找出哪些重大問題需要優先處理。此外,您可以降低問題的嚴重性等級,忽略與您專案無關的問題,或是提高嚴重性等級來凸顯特定問題。
Lint 工具會檢查 Android 專案來源檔案是否有潛在錯誤,以及在正確性、安全性、效能、可用性、無障礙和國際化層面是否需要最佳化改善。使用 Android Studio 時,每次建構應用程式時,系統都會執行設定的 Lint 和 IDE 檢查。不過,您可以手動執行檢查,或透過指令列執行 Lint。
注意:如果您的程式碼在 Android Studio 中編譯完畢,還會執行額外的 IntelliJ 程式碼檢查,以簡化程式碼審查作業。
圖 1 顯示了 Lint 工具如何處理應用程式來源檔案。
圖 1. 使用 Lint 工具進行程式碼掃描工作流程
- 應用程式來源檔案
- 來源檔案包含構成 Android 專案的檔案,包括 Java、Kotlin 和 XML 檔案、圖示和 ProGuard 設定檔。
lint.xml
檔案- 設定檔,可用於指定任何要排除的 Lint 檢查,並自訂問題嚴重性等級。
- lint 工具
- 可透過指令列或 Android Studio 執行的靜態程式碼掃描工具 (請參閱手動執行檢查作業)。lint 工具會檢查可能影響 Android 應用程式品質和效能的結構程式碼問題。強烈建議您在發布應用程式前,修正所有 Lint 偵測出的錯誤。
- lint 檢查結果
- 您可以在主控台或 Android Studio 的「Inspection Results」視窗中查看 Lint 的結果。請參閱手動執行檢查。
透過指令列執行 lint
如果您正在使用 Android Studio 或 Gradle,則可以使用 Gradle 包裝函式,透過從專案的根目錄輸入下列其中一個指令來為您的專案叫用 lint
工作:
- Windows 系統:
gradlew lint
- Linux 或 Mac:
./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 所示。
圖 2. HTML Lint 報告範例
如果您的專案包含建構變數,執行 lint 僅會檢查預設變化版本。如要在其他變化版本中執行 Lint,則必須將變化版本名稱大寫,並在前面加上「lint」。
./gradlew lintRelease
如要進一步瞭解如何透過指令列執行 Gradle 工作,請參閱透過指令列建構應用程式。
使用獨立工具執行 lint
如果您未使用 Android Studio 或 Gradle,從 SDK Manager 安裝 Android SDK 指令列工具後,即可使用獨立的 Lint 工具。接著,您可以在 android_sdk/cmdline-tools/version/bin/lint
中找到 Lint 工具。
如要對專案目錄中的檔案清單執行 Lint,請使用下列指令:
lint [flags] <project directory>
例如,您可以發出以下指令,掃描 myproject
目錄和其子目錄下的檔案。問題 ID MissingPrefix
會指示 lint 僅掃描缺少 Android 命名空間前綴的 XML 屬性。
lint --check MissingPrefix myproject
如要查看工具支援的旗標和指令列引數完整清單,請使用下列指令:
lint --help
以下範例呈現出在針對名為 Earthquake 的專案執行 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
和 UnusedResources
),以及在 Preferences.xml
版面配置檔案中的一個警告(IconMissingDensityFolder
)。
設定 Lint 以隱藏警告
根據預設,當您執行 Lint 掃描時,此工具會檢查所有支援 Lint 的問題。您也可以限制 lint 檢查問題,並指派這些問題的嚴重性等級。例如,針對與專案無關的特定問題,您可隱藏 lint 檢查,此外,您也可以將 lint 設定為在較低嚴重性等級回報非重大問題。
您可以針對不同層級設定 Lint 檢查功能:
- 全球 (整項專案)
- 專案模組
- 正式版模組
- 測試模組
- 開啟檔案
- 類別階層
- 版本管控系統 (VCS) 範圍
在 Android Studio 中設定 Lint
內建 Lint 工具會在您使用 Android Studio 時檢查程式碼。您可以透過下列兩種方式查看警示和錯誤:
- 在程式碼編輯器中以彈出式文字顯示。在 Lint 發現問題時,會標黃有問題的程式碼;若為嚴重問題,則會在程式碼下方標出紅線。
- 依序按一下「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、Kotlin 和 XML 來源檔案設定 Lint 檢查功能
您可以停用 Lint 檢查 Java、Kotlin 和 XML 來源檔案。
提示:您可以在「Default Preferences」(預設偏好設定) 對話方塊中管理 Java、Kotlin 或 XML 來源檔案的 Lint 檢查功能。依序選取「File」>「Other Settings」>「Default Settings」,然後在「Default Preferences」對話方塊的左側窗格中,依序選取「Editor」>「Inspections」。
在 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);
以下範例說明如何為 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")
設定 XML 中的 Lint 檢查功能
您可以使用 tools:ignore
屬性來停用 XML 檔案特定部分的 Lint 檢查功能。將下列命名空間值放入 lint.xml
檔案,讓 Lint 工具識別此屬性:
namespace xmlns:tools="http://schemas.android.com/tools"
以下範例說明,如何為 XML 版面配置檔案的 <LinearLayout>
元素中的 UnusedResources
問題關閉 lint 檢查功能。ignore
屬性由宣告該屬性的父項元素的子項元素繼承。在此範例中,子項 <TextView>
元素也要停用 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"
使用 Gradle 設定 Lint 選項
Gradle 的 Android 外掛程式可讓您使用模組層級 build.gradle
檔案中的 lint{}
區塊,以設定某些 lint 選項,例如執行或忽略哪些檢查項目。下列程式碼片段顯示您可設定的部分屬性:
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 true, only report errors. ignoreWarnings true // If true, lint also checks all dependencies as part of its analysis. Recommended for // projects consisting of an app with library dependencies. checkDependencies true } } ...
Kotlin
android { ... lintOptions { // Turns off checks for the issue IDs you specify. disable("TypographyFractions") disable("TypographyQuotes") // Turns on checks for the issue IDs you specify. These checks are in // addition to the default lint checks. enable("RtlHardcoded") enable("RtlCompat") enable("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 true, only report errors. ignoreWarnings = true // If true, lint also checks all dependencies as part of its analysis. Recommended for // projects consisting of an app with library dependencies. isCheckDependencies = true } } ...
用於覆寫特定問題嚴重性等級的所有 lint 方法:enable
、disable
/ignore
、informational
、warning
、error
、fatal
:請遵守設定順序。例如,在 finalizeDsl()
中將問題設為嚴重錯誤,在主要 DSL 中會覆寫禁用。
建立警示基準
您可以為專案目前的警告拍攝快照,然後使用快照做為日後檢查的基準,這樣便僅會回報新問題。基準快照可讓您開始使用 Lint 使建構失敗,而不需返回並先解決所有現有問題。
如要建立基準數據匯報,請按照下列步驟修改專案的 build.gradle
檔案。
Groovy
android { lintOptions { baseline file("lint-baseline.xml") } }
Kotlin
android { lintOptions { baseline(file("lint-baseline.xml")) } }
首次新增此行時,系統會建立 lint-baseline.xml
檔案以建立您的基準。此後,工具只會讀取檔案來判斷基準。如要建立新的基準,請手動刪除檔案,然後再次執行 Lint 以重新建立檔案。
接著,從 IDE (「Analyze」>「Inspect Code」) 或從指令列執行 lint,如下所示。輸出結果會顯示 lint-baseline.xml
檔案的位置。設定檔的檔案位置可能與此處顯示的內容不同。
$ ./gradlew lintDebug ... 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
來新增問題:
Groovy
android { lintOptions { checkOnly 'NewApi', 'HandlerLeak' baseline file("lint-baseline.xml") } }
Kotlin
android { lintOptions { checkOnly("NewApi", "HandlerLeak") baseline = file("lint-baseline.xml") } }
建立基準後,如果您在程式碼集中加入任何新警告,Lint 只會列出新錯誤。
基準警示
當基準生效時,您會收到資訊警告,表示有一或多個問題遭到篩除,因其已列入基準。這則警告是為了提醒您,您已經設定基準,因為若能修正所有問題是最理想的情況。
這則資訊警告不僅會顯示篩除的錯誤數量和警告數量,還會追蹤不再回報的問題。這項資訊可讓您知道實際的問題是否已修正,因此可選擇重新建立基準,避免錯誤再次出現時未能偵測出來。
注意:當您在 IDE 以批次模式執行檢查時,系統會啟用基準,但當您編輯檔案時,系統會在背景執行編輯檢查時忽略基準。這是因為基準適用於程式碼集有大量現有警告的情況,而您希望在本機修正程式碼。
手動執行檢查
依序選取「Analyze」>「Inspect Code」,即可手動執行設定 lint 和其他 IDE 檢查。檢查結果會顯示在「Inspection Results」視窗中。
設定檢查範圍和設定檔
選取您要分析的檔案 (檢查範圍) 和要執行的檢查 (檢查設定檔),如下所示:
- 在「Android」檢視畫面中開啟專案,選取您要分析的專案、資料夾或檔案。
- 從選單列中,依序選取「Analyze」> 「Inspect Code」。
- 在「Specify Inspection Scope」對話方塊中查看設定。
圖 3. 查看檢查範圍設定
「Specify Inspection Scope」對話方塊中顯示的選項組合,會因您選取的專案、資料夾或檔案而改變。您可以選取其他圓形按鈕,變更要檢查的項目。如需「Specify Inspection Scope」對話方塊中所有可能欄位的說明,請參閱指定檢查範圍對話方塊。
- 當您選取了一個專案、檔案或目錄時,「Specify Inspection Scope」對話方塊會顯示您所選取的「Project」、「File」或「Directory」的路徑。
- 當您選取多個專案、檔案或目錄時,「Specify Inspection Scope」對話方塊會為「Selected files」顯示已勾選的圓形按鈕。
- 在「Inspection profile」下,保留預設的設定檔 (「Project Default」)。
- 按一下「OK」執行檢查。圖 4 顯示了「Inspect Code」執行作業中的 lint 和其他 IDE 檢查結果:
圖 4. 選取問題即可查看解決方案
-
在左側的窗格中,透過展開並選取錯誤類別、類型和問題來查看檢查結果。
右側窗格會顯示所選錯誤類別、類型或問題的檢查報告,並提供錯誤的名稱和位置。在適用情況下,檢查報告會顯示其他資訊,例如問題語法,協助您修正問題。
- 在左側窗格樹狀檢視中,右鍵按一下類別、類型或問題,即可顯示內容選單。
根據您的背景資訊,您可以進行以下某些或部分操作:跳至來源、排除和納入所選項目、隱藏問題、編輯設定、管理檢查快訊,以及重新執行檢查。
有關左側工具列按鈕、內容選單項目和檢查報告欄位的說明,請參閱「檢查工具視窗」。
使用自訂範圍
您可以使用 Android Studio 提供的其中一個自訂範圍,如下所示:
- 在「Specify Inspection Scope」對話方塊中,按一下「Custom scope」。
- 按一下「Custom scope」下拉式清單即可顯示選項。
圖 5. 選取要使用的自訂範圍
- 「Project Files」:目前專案中的所有檔案。
- 「Project Production Files」:僅限目前專案中的正式版檔案。
- 「Project Test Files」:僅限目前專案中的測試檔案。請參閱測試類型和位置。
- 「Open Files」:僅顯示您在目前專案中開啟的檔案。
- 「Module <your-module>」:僅顯示目前專案中對應模組資料夾中的檔案。
- 「Current File」:僅顯示目前專案中的檔案。在選取檔案或資料夾時顯示。
- 「Class Hierarchy」:選取這個選項然後按一下「OK」後,畫面上會出現一個對話方塊,其中列出了目前專案中的所有類別。使用對話方塊中的「Search by Name」欄位來篩選並選取要檢查的類別。如果您未篩選類別清單,程式碼檢查功能會檢查所有類別。
- 按一下「OK」。
建立自訂範圍
如果您想要查看不在任何現有自訂範圍範圍內的檔案和目錄,您可建立自訂範圍。
- 在「Specify Inspection Scope」對話方塊中,選取「Custom scope」。
- 按一下「Custom scope」下拉式清單中後方的三個點。
圖 6. 指定檢查範圍對話方塊
系統會隨即顯示「Scopes」對話方塊。
圖 7. 建立自訂範圍
- 按一下「Add」
定義新的範圍。
- 在隨後顯示的「Add Scope」下拉式清單中,選取「Local」。
本機和共用範圍都會用於專案中的「Inspect Code」功能。「Shared」範圍也可供其他具有範圍欄位的專案功能使用。例如,當您按一下「Edit Settings」圖示
變更「Find Usages」設定時,產生的對話方塊會顯示「Scope」欄位,供您選取共用的範圍。
圖 8. 從「Find Usages」對話方塊中選取共用範圍
- 為範圍命名,然後按一下「OK」。
「Scopes」對話方塊的右側窗格會填入可讓您定義自訂範圍的選項。
- 在下拉式清單中選取「Project」。
畫面會顯示可用的專案清單。
注意:您可以為專案或套件建立自訂範圍。步驟均相同。
- 展開專案資料夾,選取要新增至自訂範圍的項目,然後按一下右側的其中一個按鈕。
圖 9.定義自訂範圍
- 「Include」:包含這個資料夾及其檔案,但不包含所屬的任何子資料夾。
- 「Include Recursively」:包含這個資料夾及其所有檔案、子資料夾及其檔案。
- 「Exclude」:排除這個資料夾及其檔案,但不排除任何子資料夾。
- 「Exclude Recursively」:排除這個資料夾及其所有檔案、子資料夾及其檔案。
圖 10 顯示了包含「main」資料夾,且以遞迴方式包含「java」資料夾。藍色表示部分包含的資料夾,綠色表示週期性包含的資料夾和檔案。
圖 10.自訂範圍的範例
- 如果您選取「java」資料夾,然後按一下「Exclude Recursively」,綠色醒目提示便不會出現在「java」資料夾以及所有資料夾和檔案上。
- 假如選取的是標示綠色的「MainActivity.java」檔並按一下排除,「MainActivity.java」不會再出現綠色的醒目顯示,然而「java」資料夾下的其他項目會以綠色醒目顯示。
- 按一下「OK」。自訂範圍會顯示在下拉式清單中的底部。
查看及編輯檢查設定檔
Android Studio 提供一組 lint 和其他檢查設定檔,其會透過 Android 更新進行更新。您可直接使用這些設定檔,也可以編輯名稱、說明、嚴重性和範圍。您也可以啟用及停用整個群組或群組中的個別設定檔。
如要存取「Inspections」對話方塊:
- 依序選取「Analyze」>「Inspect Code」。
- 在「Inspection profile」下的「Specify Scope」 對話方塊中,按一下「More」。
「Inspections」對話方塊會顯示支援檢查項目及其說明的清單。
圖 11. 支援的檢查項目與相關說明
- 選取「Profile」下拉式清單,即可在「Default」(Android Studio) 和「Project Default」(啟用的專案) 的檢查之間切換。詳情請參閱這個 IntelliJ 指定檢查範圍對話方塊頁面。
- 在左側窗格的「Inspections」對話方塊中,選取頂層的設定檔分類,或展開一個群組然後選取一個特定的設定檔。選取設定檔類別後,您可以將該類別中的所有檢查項目編輯為單次檢查。
- 選取「Manage」下拉式清單,即可複製、重新命名、新增說明、匯出及匯入檢查。
- 完成後,請按一下「OK」。