代碼優(yōu)化--Android Lint(二)

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 警告
只需兩步:

  1. xml 中聲明 tools 命名空間
  2. 使用 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)容)盆驹,然后再選擇檢測范圍開始檢測圆丹。

檢測內(nèi)容

當(dāng)檢測出的無用資源過多時,你會發(fā)現(xiàn)一個一個處理時多么的繁瑣躯喇,這時可以注意到辫封,下圖右邊有解決方法:Remove All Unused Resources,點擊后廉丽,就沒有了倦微。
注:使用該方法后可能會造成某些資源誤刪的情況,因此刪除之后不要忘記編譯運行正压,利用 git 對其中誤刪資源進(jìn)行 reset欣福。

檢測結(jié)果

對于無用資源的處理方式有:

  • "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工具使用實錄及整理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蠢正,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子省店,更是在濱河造成了極大的恐慌嚣崭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懦傍,死亡現(xiàn)場離奇詭異雹舀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粗俱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門说榆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寸认,你說我怎么就攤上這事签财。” “怎么了偏塞?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵唱蒸,是天一觀的道長。 經(jīng)常有香客問我灸叼,道長神汹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任怜姿,我火速辦了婚禮,結(jié)果婚禮上疼燥,老公的妹妹穿的比我還像新娘沧卢。我一直安慰自己,他們只是感情好醉者,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布但狭。 她就那樣靜靜地躺著,像睡著了一般撬即。 火紅的嫁衣襯著肌膚如雪立磁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天剥槐,我揣著相機(jī)與錄音唱歧,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛颅崩,可吹牛的內(nèi)容都是我干的几于。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沿后,長吁一口氣:“原來是場噩夢啊……” “哼沿彭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尖滚,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喉刘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漆弄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睦裳,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年置逻,在試婚紗的時候發(fā)現(xiàn)自己被綠了推沸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡券坞,死狀恐怖鬓催,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恨锚,我是刑警寧澤宇驾,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站猴伶,受9級特大地震影響课舍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜他挎,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一筝尾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧办桨,春花似錦筹淫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殊霞,卻和暖如春摧阅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绷蹲。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工棒卷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓娇跟,卻偏偏與公主長得像岩齿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苞俘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354