自動化程式碼檢查優化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工具是如何處理應用程式的原始碼檔案的。
應用程式原始碼檔案
原始碼檔案包含了那些構成你的Android工程的檔案,包括 Java 和 XML檔案,圖示,以及 ProGuard 配置檔案。
lint.xml 檔案
這是一個配置檔案,你可以用它來指定任何你想要排除出去的Lint檢查,還有就是對問題的嚴重級別進行自定義。
Lint 工具
這是一個靜態的程式碼掃描工具,你可以通過命令列或者 Android Studio來把它執行起來。Lint 工具會檢查哪些可能會影響到Android應用程式質量及效能的結構方面的程式碼問題。我們強烈建議你在釋出應用程式之前,先把Lint檢測出來的錯誤 修正 。
Lint檢查的結果
你可以在控制檯或者 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 檢查進行配置:
全域性地,針對整個工程
每個工程模組
每個生產模組
每個測試模組
每個開啟的檔案
每個類層級
每個版本控制系統(VCS)範圍內
在 Android Studio 中對Lint進行配置
在你使用的是Android Studio時,其內建的 Lint 工具會對你的程式碼進行檢查。你可以使用兩種方式來檢視警告和錯誤資訊:
程式碼編輯器中的一個彈出文字. 當 Lint 發現一處問題時,它會讓問題程式碼顯示成高亮的黃色,或者針對更加嚴重的問題,讓程式碼帶上紅色的下劃線。
在你選擇 Analyze > Inspect Code 所開啟的 Lint 檢查結果視窗中。
要對預設的 Lint 檢查進行設定的話
在 Android Studio 中開啟你的專案。
選擇 File > Other Settings > Default Settings。
在預設選項( Default Preferences )對話方塊中選擇 Editor > Inspections 。
在 Profile 區域選擇 Default 或者 Project Default 來設定 掃描範圍 是針對 Android Studio中的所有工程,或僅僅只針對對應的工程。
將一個類別展開,然後按需修改 Lint 設定。
你可以選擇單個檢查,或者整個所有的類別。
點選 OK 。
要製作一份 Lint 檢查的列表顯示在檢查結果 ( Inspection Results ) 視窗的話:
在 Android Studio 中開啟你的工程並選擇工程中你想要進行測試那一部分。
選擇 Analyze > Inspect Code。
在指定檢查範圍( Specify Inspection Scope )對話方塊中,選擇要進行檢查的 範圍 和方面。
範圍會指定你想要分析的檔案,而方面則是指定你想要執行的那些 Lint 檢查。
如果你想要對 Lint 設定進行修改的話,就點選檢查(Inspections)對話方塊中的 …,選擇性的點選 Manage 來定義一個新的方面,指定你自己所想的Lint設定,然後點選 OK 。
在檢查( Inspections ) 對話方塊中,你可以進行字串搜尋來找到 Lint 檢查。注意在 檢查 視窗中如果修改了一個方面的 Lint設定,並不會改變上一個過程中所講到的預設設定。不過它確實改變了在 檢查 對話方塊中顯示的那些設定 。
點選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