Android lint是在ADT16(Android SDK Tools 16 )提供的新工具饵婆,它是一個代碼掃描工具铣耘,用于檢測 Android 的代碼質(zhì)量票堵。developers介紹
簡單介紹
Lint 會根據(jù)預(yù)先配置的檢測標(biāo)準(zhǔn)檢查我們 Android 項目的源文件慎璧,發(fā)現(xiàn)潛在的 bug 或者可以優(yōu)化的地方抛计,優(yōu)化的內(nèi)容主要包括以下幾方面:
- Correctness: 不夠完美的編碼哄孤,比如硬編碼、使用過時 API 等 吹截;
- Performanc: 對性能有影響的編碼瘦陈,比如:靜態(tài)引用,循環(huán)引用等 波俄;
- Internationalization: 國際化晨逝,直接使用漢字,沒有使用資源引用等 懦铺;
- Security: 不安全的編碼捉貌,比如在 WebView 中允許使用 JavaScript Interface 等 ;
- Usability: 可用的冬念,有更好的替換的趁窃,比如排版、圖標(biāo)格式建議.png格式 等 急前;
- Accessibility: 輔助選項棚菊,比如 ImageView 的 contentDescription 往往建議在屬性中定義等;
…
Lint 檢測代碼的過程如下圖所示:
- App 源文件:包括 Java 代碼叔汁,XML 代碼统求,圖標(biāo),以及 ProGuard 配置文件等据块。
- lint.xml:Lint 檢測的執(zhí)行標(biāo)準(zhǔn)配置文件码邻,可以修改它來允許/禁止報告一些問題。
Android Studio直接使用Lint檢查項目
Android Studio 2.0 以后另假,谷歌將 Lint 檢查整合到了 IDE 之中像屋,提供了方便的圖形界面操作,檢測結(jié)果也會在底部 Inspection Results 中展現(xiàn)边篮。
Lint規(guī)則配置
在開始之前己莺,可以通過對 lint.xm / lintOptions 的配置去實現(xiàn)符合自己項目的 Lint 檢測規(guī)則奏甫。
lintOptions: 定義在 gradle(build.gradl) 文件中,下面列舉 lintOptions 可定義的選項凌受。
android {
lintOptions {
// true--關(guān)閉lint報告的分析進(jìn)度
quiet true
// true--錯誤發(fā)生后停止gradle構(gòu)建
abortOnError false
// true--只報告error
ignoreWarnings true
// true--忽略有錯誤的文件的全/絕對路徑(默認(rèn)是true)
//absolutePaths true
// true--檢查所有問題點阵子,包含其他默認(rèn)關(guān)閉項
checkAllWarnings true
// true--所有warning當(dāng)做error
warningsAsErrors true
// 關(guān)閉指定問題檢查
disable 'TypographyFractions', 'TypographyQuotes'
// 打開指定問題檢查
enable 'RtlHardcoded', 'RtlCompat', 'RtlEnabled'
// 僅檢查指定問題
check 'NewApi', 'InlinedApi'
// true--error輸出文件不包含源碼行號
noLines true
// true--顯示錯誤的所有發(fā)生位置,不截取
showAll true
// 回退lint設(shè)置(默認(rèn)規(guī)則)
lintConfig file("default-lint.xml")
// true--生成txt格式報告(默認(rèn)false)
textReport true
// 重定向輸出胜蛉;可以是文件或'stdout'
textOutput 'stdout'
// true--生成XML格式報告
xmlReport false
// 指定xml報告文檔(默認(rèn)lint-results.xml)
xmlOutput file("lint-report.xml")
// true--生成HTML報告(帶問題解釋挠进,源碼位置,等)
htmlReport true
// html報告可選路徑(構(gòu)建器默認(rèn)是lint-results.html )
htmlOutput file("lint-report.html")
// true--所有正式版構(gòu)建執(zhí)行規(guī)則生成崩潰的lint檢查誊册,如果有崩潰問題將停止構(gòu)建
checkReleaseBuilds true
// 在發(fā)布版本編譯時檢查(即使不包含lint目標(biāo))领突,指定問題的規(guī)則生成崩潰
fatal 'NewApi', 'InlineApi'
// 指定問題的規(guī)則生成錯誤
error 'Wakelock', 'TextViewEdits'
// 指定問題的規(guī)則生成警告
warning 'ResourceAsColor'
// 忽略指定問題的規(guī)則(同關(guān)閉檢查)
ignore 'TypographyQuotes'
}
}
lint.xml:用來指定你想禁用哪些lint檢查功能,以及自定義問題嚴(yán)重度 (problem severity levels)案怯,此時可以通過 lintOptions 中的 lintConfig file("lint.xml") 來指定配置文件的所在目錄君旦。
Lint.xml 中關(guān)鍵是對 issue(用id指定)的 severity 進(jìn)行指定,lint.xml文件由一個封閉的父標(biāo)簽組成嘲碱,它包含了一個或者多個子標(biāo)簽于宙。Lint為每一個定義了唯一的id屬性值,通過設(shè)置標(biāo)識的安全屬性悍汛,你可以改變一個問題的安全級別,或者這個問題的 lint檢查至会,并且可以指定該 issue作用于指定的文件還是當(dāng)前項目离咐。
把 lint.xml放在項目的根目錄中,命令行執(zhí)行 lint時候奉件,lint就會用lint.xml中的規(guī)則宵蛀。另外,執(zhí)行 lint時還可以用參數(shù) –config 指定一個全局的配置用于所有的項目县貌。當(dāng)項目中已有 lint.xml术陶,則對于某個 issue而言,在lint.xml中沒有對該 issue特別定制的情況下煤痕,–config指定的文件中的該 issue的定制才起作用梧宫。 整體結(jié)構(gòu)如下:
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- 需要配置的 issues 列表 -->
<!-- 關(guān)閉對應(yīng)的檢測-->
<issue id="IconMissingDensityFolder" severity="ignore" />
<!-- 在一些特定的文件中關(guān)閉對應(yīng)的檢測 -->
<issue id="ObsoleteLayoutParam">
<ignore path="res/layout/activation.xml" />
<ignore path="res/layout-xlarge/activation.xml" />
</issue>
<!-- 將對應(yīng)的檢測級別修改 -->
<issue id="HardcodedText" severity="error" />
</lint>
id 的獲取我們可以通過命令行 lint --list 獲取。如果無法直接執(zhí)行 lint 命令摆碉,我們可以在 /.bash_profile 中添加 PATH="~/Library/Android/sdk/tools/bin:${PATH}" 即可塘匣。
使用方式
1. 選擇要分析的項目或者文件、文件夾巷帝,從菜單欄忌卤,選擇工具欄 - > Analyze -> Inspect Code;
2. 選擇檢查的范圍(整個工程/指定Module/指定文件/文件夾)
- Project Files:所有項目文件
- Project Production Files:項目的代碼文件
- Project Test Files:項目的測試文件
- Open Files:當(dāng)前打開的文件
- Module ‘Module Name’:主要的 *** 模塊
- Current File:當(dāng)前文件
…
3. 結(jié)果展示
左側(cè)會提示你需要修改的地方楞泼,點擊某一條驰徊,右側(cè)則會出現(xiàn)關(guān)于該問題的詳細(xì)描述笤闯。
部分檢測結(jié)果的分析:
4. 結(jié)果分析
得到檢查的結(jié)果后,就得開始對代碼進(jìn)行優(yōu)化了棍厂,但是 Lint 報的某些警告的確是沒必要的颗味,這時我們可以選擇忽略這些警告。因此其實在分析處理時勋桶,我們可以根據(jù)實際的需求進(jìn)行忽略脱衙。其中忽略警告可以分兩種:
- Java 代碼中
- XML 文件夾中
在 Java 代碼中忽略 Lint 警告
忽略 Lint 警告的注解跟 @SuppressWarnings 很類似,@SuppressLint(“忽略的警告名稱”)例驹。下面的代碼演示了如何忽略 Lint 對使用 -- 新 API 的警告:
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
要是不清楚要忽略的警告具體是什么名字捐韩,可以直接忽略 all,當(dāng)然是當(dāng)前類/方法/對象:
@SuppressLint("all")
在 XML代碼中忽略 Lint 警告
只需兩步:
- xml 中聲明 tools 命名空間
- 使用 tools:ignore=“忽略的警告名”
如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="all"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/white">
5. 檢測無用資源文件
隨著不斷地進(jìn)行代碼版本迭代鹃锈,非常容易遺留一些無用的代碼/源文件荤胁,這時可以通過直接指定檢測無用資源,實現(xiàn) Lint 清除屎债。
方法:工具欄 -> Analyze -> Run Inspection By Name..仅政,輸入要檢測的內(nèi)容(此時是unused resources,當(dāng)然也可以刪選其他內(nèi)容)盆驹,然后再選擇檢測范圍開始檢測圆丹。
當(dāng)檢測出的無用資源過多時,你會發(fā)現(xiàn)一個一個處理時多么的繁瑣躯喇,這時可以注意到辫封,下圖右邊有解決方法:Remove All Unused Resources,點擊后廉丽,就沒有了倦微。
注:使用該方法后可能會造成某些資源誤刪的情況,因此刪除之后不要忘記編譯運行正压,利用 git 對其中誤刪資源進(jìn)行 reset欣福。
對于無用資源的處理方式有:
- "Remove All Unused Resources ":移出無用資源;
- "Remove Declaration for XXX ":移出對XXX的聲明焦履;
- "Add a tools:keep attribute to mark as implicitly used ":添加 tools:keep 屬性來標(biāo)記隱式使用拓劝,在XML 文件的根元素 resources 里自動添加了 tools 命名空間,再加上"tools:keep" 嘉裤。
tools:keep
適用于 <resources> 資源標(biāo)簽凿将。當(dāng)開啟了資源壓縮(shrinking resource)功能時,這個屬性允許你指定哪些資源需要被保留价脾。
因為開啟了資源壓縮功能后牧抵,未被引用的資源文件會在構(gòu)建過程中被移除,而部分使用 Resources.getIdentifier() 進(jìn)行引用的資源文件可能被誤刪。
此時我們可以使用該屬性 指定哪些資源需要保留犀变,不能被移除妹孙。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/used_1,@layout/used_2,@layout/*_3" />
可參考:Android開發(fā)技巧之xml tools屬性詳解
參考文章:
阿里的代碼規(guī)范檢測插件
Android 性能優(yōu)化:使用 Lint 優(yōu)化代碼、去除多余資源
Android Studio使用Lint進(jìn)行代碼檢查
如何在android studio 中使用 link工具
Android Studio 的代碼檢查功能获枝,使用 Lint 工具優(yōu)化代碼(筆記)
Android性能優(yōu)化之工具篇 — — Android Lint
Inspect Code功能
Lint工具使用實錄及整理