(八)上篇 Android 性能優(yōu)化 Lint 工具使用

小酌雞湯

青春須早為,豈能長少年。

本文來源《Android 性能優(yōu)化 全家桶》

為什么通過 lint 檢查改進(jìn)代碼?

?除了通過構(gòu)建測(cè)試來確保您的應(yīng)用符合其功能要求之外,您務(wù)必還要通過 lint 運(yùn)行您的代碼來確保代碼不存在結(jié)構(gòu)問題。結(jié)構(gòu)不合理的代碼會(huì)影響 Android 應(yīng)用的可靠性和效率,并使您的代碼更難以維護(hù),而 lint 工具有助于找到這些代碼。
?例如,如果 XML 資源文件包含未使用的命名空間,則不僅占用空間,還會(huì)導(dǎo)致不必要的處理。其他結(jié)構(gòu)問題(如使用目標(biāo) API 版本不支持的已棄用的元素或 API 調(diào)用)可能會(huì)導(dǎo)致代碼無法正常運(yùn)行。 lint 可幫助您解決這些問題。

lint 工具如何處理應(yīng)用源文件?

Lint工作原理
  • 應(yīng)用源文件:源文件包含組成 Android 項(xiàng)目的文件,包括 Java、Kotlin 和 XML 文件、圖標(biāo)以及 ProGuard 配置文件。
  • lint.xml 文件:一個(gè)配置文件,可用于指定要排除的任何 lint 檢查以及自定義問題嚴(yán)重級(jí)別。
  • lint 工具:一個(gè)靜態(tài)代碼掃描工具,您可以從命令行或在 Android Studio 中對(duì) Android 項(xiàng)目運(yùn)行該工具
  • lint 檢查結(jié)果:您可以在控制臺(tái)或 Android Studio 的 Inspection Results 窗口中查看 lint 檢查結(jié)果。

現(xiàn)在,就一起實(shí)操體驗(yàn) Lint ~

(1)lint實(shí)操環(huán)境(可選項(xiàng),用自己的環(huán)境和代碼也一樣)
  • SamplePop環(huán)境如下:
    ?Android Studio 4.0
    ?Gradle version 6.1.1
    ?Android API version 30
(2)從命令行運(yùn)行 lint
//windows 
gradlew lint

//Linux 或 Mac
./gradlew lint

//如果您只想對(duì)某個(gè)特定的構(gòu)建變體運(yùn)行 lint 任務(wù),則在大寫變體名稱并在其前面加上 lint 前綴
 gradlew lintDebug

//會(huì)有如下輸出:
> Task :lint:lint
Ran lint on variant debug: 9 issues found
Ran lint on variant release: 9 issues found
Wrote HTML report to file:///F:/Git/Blog/SamplePop/lint/build/reports/lint-results.html
Wrote XML report to file:///F:/Git/Blog/SamplePop/lint/build/reports/lint-results.xml

?進(jìn)入文件夾,找到lint-results.html,雙擊這個(gè)文件


Lint命令行生成分析結(jié)果文件
Lint命令行生成分析結(jié)果展示

常見問題可以分為如下幾個(gè)大類:

(1)Accessibility 輔助選項(xiàng),比如ImageView的contentDescription往往建議在屬性中定義等。
(2)Compliance 合規(guī)性,違反了Google Play的要求,比如使用了過期的庫版本,性能、安全性、API等級(jí)等沒有遵循新系統(tǒng)的要求等。
(3)Correctness 不夠完美的編碼,比如硬編碼、使用過時(shí)API等。
(4)Internationalization 國際化,直接使用漢字,沒有使用資源引用等
(5)Interoperability 互操作性,比如和Kotln的交互等。
(6)Performanc 對(duì)性能有影響的編碼,比如:靜態(tài)引用,循環(huán)引用等
(7)Security 不安全的編碼,比如在 WebView 中允許使用 JavaScriptInterface等
(8)Usability 可用的,有更好的替換的 比如排版、圖標(biāo)格式建議.png格式等

(3)使用獨(dú)立工具運(yùn)行 lint(不實(shí)用,忽略即可)
//工具路徑:android_sdk/tools/

//要對(duì)項(xiàng)目目錄中的文件列表運(yùn)行 lint
lint [flags] <project directory>

//例如:
lint --check MissingPrefix myproject 

//查看幫助
lint --help
(4)Lint配置

您可以配置不同級(jí)別的 Lint 檢查:

  • 全局(整個(gè)項(xiàng)目)
  • 項(xiàng)目模塊
  • 生產(chǎn)模塊
  • 測(cè)試模塊
  • 打開的文件
  • 類層次結(jié)構(gòu)
  • 版本控制系統(tǒng) (VCS) 范圍
(4.1)Android Studio 中配置 Lint(內(nèi)置的 Lint)
  • 在AS代碼編輯器中的彈出文本查看。lint 發(fā)現(xiàn)問題后,會(huì)用黃色突出顯示有問題的代碼,而對(duì)于更嚴(yán)重的問題,則會(huì)在代碼下面添加紅色下劃線。
  • 依次點(diǎn)擊 Analyze > Inspect Code 后,在 lint Inspection Results 窗口中查看。
(4.2)配置 lint.xml 文件
//lint.xml文件建議放置在 Android 項(xiàng)目的根目錄下,build.gradle配置如下:
android {
    lintOptions {
        lintConfig file("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 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>

(4.3)配置 Java、Kotlin 和 XML 源文件的 lint 檢查
//1 配置 Java 或 Kotlin 的 lint 檢查
//1.1 停用 lint 檢查,請(qǐng)向該代碼添加 @SuppressLint 注釋
@SuppressLint("NewApi")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)

//1.2 對(duì) FeedProvider 類中的 ParserError 問題關(guān)閉 lint 檢查
@SuppressLint("ParserError")
    class FeedProvider : ContentProvider() {

//1.3 禁止 lint 檢查文件中的所有問題
 @SuppressLint("all")

//2 配置 XML 的 lint 檢查
//2.1  tools:ignore 屬性對(duì) XML 文件的特定部分停用 lint 檢查
//布局文件的 <LinearLayout> 元素中的 UnusedResources 問題關(guān)閉 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>

//2.2 禁止檢查多個(gè)問題,請(qǐng)使用以逗號(hào)分隔的字符串列出要禁止檢查的問題
tools:ignore="NewApi,StringFormatInvalid"

//2.3 要禁止 lint 檢查 XML 元素中的所有問題,請(qǐng)使用 all 關(guān)鍵字
tools:ignore="all"

(4.4)通過 Gradle 配置 lint 選項(xiàng)
//build.gradle配置如下:
android {
    lintOptions {
        // 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.
        check '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
    }
}  
(5)創(chuàng)建警告基準(zhǔn)

?您可以為項(xiàng)目的當(dāng)前警告集創(chuàng)建快照,然后將該快照用作將來運(yùn)行檢查的基準(zhǔn),以便只報(bào)告新問題。 有了基準(zhǔn)快照,您便可開始使用 lint 讓構(gòu)建失敗,而不必先返回并解決所有現(xiàn)有問題。
?個(gè)人感覺尤其是對(duì)多人的項(xiàng)目協(xié)同時(shí),此基準(zhǔn)特別有用。

//要?jiǎng)?chuàng)建基準(zhǔn)快照,請(qǐng)修改項(xiàng)目的 build.gradle 文件,如下所示:
 android {
      lintOptions {
        baseline file("lint-baseline.xml")
      }
    }

//自定義基準(zhǔn):如果要將某些問題類型(而不是全部)添加到基準(zhǔn)
android {
      lintOptions {
        check 'NewApi', 'HandlerLeak'
        baseline file("lint-baseline.xml")
       }
    }

?首次添加此代碼行時(shí),系統(tǒng)會(huì)創(chuàng)建 lint-baseline.xml 文件以建立基準(zhǔn)。此后,lint 工具僅讀取該文件以確定基準(zhǔn)。如果要?jiǎng)?chuàng)建新基準(zhǔn),請(qǐng)手動(dòng)刪除該文件并再次運(yùn)行 lint 以重新創(chuàng)建它。

Lint生成警告基準(zhǔn)

?實(shí)行基準(zhǔn)時(shí),您會(huì)收到一條信息性警告,告知您一個(gè)或多個(gè)問題已被過濾掉,因?yàn)樗鼈円言诨鶞?zhǔn)中列出。之所以發(fā)出這條警告,是為了幫您記住您已配置基準(zhǔn),因?yàn)槔硐肭闆r下,您希望在某一時(shí)刻解決所有問題。

Lint警告基準(zhǔn)的已過濾警告提示
(6)手動(dòng)運(yùn)行檢查

?您可以通過依次選擇 Analyze > Inspect Code,手動(dòng)運(yùn)行配置的 lint 及其他 IDE 檢查。檢查結(jié)果將顯示在 Inspection Results 窗口中。
?追求細(xì)節(jié)請(qǐng)查閱文章末尾的谷歌官網(wǎng)(最全最詳細(xì))。

Lint設(shè)置檢查范圍和配置文件
Lint手動(dòng)運(yùn)行檢查結(jié)果展示
趕緊對(duì)自己的項(xiàng)目代碼實(shí)操開始吧~ 會(huì)有驚喜~

小編的擴(kuò)展鏈接

參考鏈接

姿容清麗厭奢華,淡淡平平不自夸

?

舉手之勞,贊有余香!???比心??

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評(píng)論 6 530
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 97,947評(píng)論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評(píng)論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,268評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,817評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,039評(píng)論 0 285
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,551評(píng)論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,502評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,662評(píng)論 1 366
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評(píng)論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,907評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評(píng)論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,255評(píng)論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,637評(píng)論 2 370