Android 性能優化:使用 Lint 優化代碼、去除多餘資源

来源:https://www.cnblogs.com/jiangzhishan/archive/2018/07/23/9342320.html
-Advertisement-
Play Games

前言 在保證代碼沒有功能問題,完成業務開發之餘,有追求的程式員還要追求代碼的規範、可維護性。 今天,以“成為優秀的程式員”為目標的拭心將和大家一起精益求精,學習使用 Lint 優化我們的代碼。 什麼是 Lint Lint 是Android Studio 提供的 代碼掃描分析工具,它可以幫助我們發現代 ...


前言

在保證代碼沒有功能問題,完成業務開發之餘,有追求的程式員還要追求代碼的規範、可維護性。

今天,以“成為優秀的程式員”為目標的拭心將和大家一起精益求精,學習使用 Lint 優化我們的代碼。

什麼是 Lint

Lint 是Android Studio 提供的 代碼掃描分析工具,它可以幫助我們發現代碼結構/質量問題,同時提供一些解決方案,而且這個過程不需要我們手寫測試用例。

Lint 發現的每個問題都有描述信息和等級(和測試發現 bug 很相似),我們可以很方便地定位問題,同時按照嚴重程度進行解決。

當然這個“嚴重程度”我們可以手動調節,有些原則問題不容侵犯,必須提升到 error,而有的個別問題也可以無視,畢竟人非聖賢孰能無過嘛。

Lint 工作方式簡單介紹

Lint 會根據預先配置的檢測標準檢查我們 Android 項目的源文件,發現潛在的 bug 或者可以優化的地方,優化的內容主要包括以下幾方面:

  • Correctness:不夠完美的編碼,比如硬編碼、使用過時 API 等
  • Performance:對性能有影響的編碼,比如:靜態引用,迴圈引用等
  • Internationalization:國際化,直接使用漢字,沒有使用資源引用等
  • Security:不安全的編碼,比如在 WebView 中允許使用 JavaScriptInterface 等

Lint 檢測代碼的過程如下圖所示:

  • App 源文件:包括 Java 代碼,XML 代碼,圖標,以及 ProGuard 配置文件等
  • lint.xml:Lint 檢測的執行標準配置文件,我們可以修改它來允許或者禁止報告一些問題

從命令行運行 Lint

Lint 的命令很簡單:

lint [flags] <project directory>

Lint 也可以使用 Gradle 運行:

Windows:

gradlew lint

Mac:

./gradlew lint

具體命令行相關的操作這裡就不介紹了,因為這個過程實在太痛苦,上一張命令行運行 Lint 後得到的 XML 文件截圖讓你體驗一下:

看著渾身不舒服,想瞭解如何從命令行使用 Lint 的同學可以點擊這裡前往官方學習。

我們還是直接進入 Lint 的 GUI 操作吧。

Android Studio 中使用 Lint

Android Studio 中內置了 Lint,我們小手一點就可以直接使用。

Lint 的使用路徑: 
工具欄 -> Analyze -> Inspect Code…

點擊 Inspect Code 後會彈出檢查範圍的對話框:

預設是檢查整個項目,我們可以點擊 Custom scope 自定義檢查範圍。

點擊右邊的下拉框,會出現以下選擇:

分別有:

  • Project Files:所有項目文件
  • Project Production Files:項目的代碼文件
  • Project Test Files:項目的測試文件
  • OpenFiles:當前打開的文件
  • Module ‘app’:主要的 app 模塊
  • Current File:當前文件

除了內置的選項我們還可以自己選擇特定的類進行檢查,點擊下圖中的紅色框部分:

會彈出自定義範圍選擇框,預設是空的,我們可以點擊左上角的“+”號新增一個檢查範圍:

- Local:只能當前項目使用 
- Shared:其他 Android Studio 項目也可以使用

我們選擇 Shared,然後起個帥氣的名字 “ShixinCuteLint”,預設按項目顯示,這時檢查的文件數為 0 :

上圖中右邊的四個按鈕表示要操作的類型:

  • Include:包括當前文件夾內的文件,但不包括他的子文件夾
  • Include Recursively:包括當前文件夾以及它的子文件夾內所有的文件夾,遞歸添加
  • Exclude:移除當前文件夾,不包括子文件夾
  • Exclude Recursively:移除當前文件夾及所有子文件夾

我們點擊左邊的 app 文件夾後,點擊右邊的 Include Recursively 按鈕,把 app 下的所有文件添加到檢查列表:

可以看到,這時 app 下的文件都變綠了,總共有 689 個文件夾要掃描。

點擊 OK 進行檢測,稍等一會兒,會彈出 Inspection 對話框,顯示檢查結果,沒想到我的代碼居然有 1769 個警告!這數字觸目驚心啊:

我們主要關註紅框內的警告,先來看看我的代碼 Performance 有什麼問題:

哈哈,沒想到我還有這麼多進步空間!

上圖可以看到,Lint 真是神器,可以幫我們發現自己忽略或者沒有意識到的問題,尤其是性能方面,如果你覺得自己代碼想優化又不知道從何做起,不妨讓 Lint 給你指指路。

團隊中建立代碼規範利器:提升、降低問題的等級

雖然 Lint 可以幫我們檢查代碼的問題,但多人合作時,我們更期望可以在寫代碼時就發現問題、解決問題。

鑒於團隊成員中水平良莠不齊,靠個人意識有時候很難保證質量,這時可以修改 Lint 對於特定問題的警告等級,以最直觀的 IDE 提示來警醒成員。

Lint 的警告嚴重程度有以下幾種:

  • Unused Entry:沒有使用的屬性,灰色,很不起眼
  • Typo:拼寫錯誤,綠色波浪下劃線,也不太起眼
  • Server Problem:伺服器錯誤?好像不是
  • Info:註釋文檔,綠色,比較顯眼
  • Weak Warning:比較弱的警告,提示比較弱
  • Warning:警告,略微顯眼一點
  • Error:錯誤,最顯眼的一個

日常開發中,好一點的程式員會關註 Warning 的警告,根據警告優化代碼,但那也只是很少一部分。但是紅色的 Error 就不一樣了,基本上看到就想要消滅掉。

我們拿命名拼寫錯誤舉個例子。

類、對象、遍歷拼寫錯誤看起來不是什麼問題,但是如果你見過大量的無意義或者錯誤命名,你一定會贊同我的接下來做法。

預設的拼寫錯誤是 Typo ,提示很弱,所以常被人忽略:

上面的 String 類型變數 login 寫成了 logn,Lint 預設對拼寫錯誤是個下滑波浪線,很不起眼。我們修改一下。

打開 Preferences/Settings,搜索 Inspections,會出現 Lint 的檢測配置頁面:

要修改拼寫的警告等級,搜索“spelling”:

然後選擇出現的 Typo,再點擊右邊的 Severity 就是嚴重程度,改成 Error,OK。

可以看到,現在拼寫錯誤就會出現紅色的錯誤警告了,讓你不好好寫變數名!

Lint 雖好,也不能貪杯。

Lint 就像是一個潔癖患者,雖然可以讓我們代碼乾凈許多,但是如果真要把它提示的全解決,恐怕老闆要發怒了:給你發工資天天玩電腦,怎麼不出活呢?!

Lint 報的某些警告的確是沒必要,這時我們可以選擇忽略這些警告。忽略警告可以分兩種:

  1. 在 Java 代碼中
  2. 在 XML 文件夾中

在 Java 代碼中忽略 Lint 警告:

忽略 Lint 警告的註解跟 @SuppressWarnings 很類似,@SuppressLint(“忽略的警告名稱”)。

下麵的代碼演示瞭如何忽略 Lint 對使用新 API 的警告:

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

要是你不清楚要忽略的警告具體是什麼名字,那就直接忽略 all,當然是當前類/方法/對象:

@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">

Gradle 中配置 Lint

Gradle 中也可以配置 Lint 的關鍵操作,比如是否開啟 Lint 警告,或者關閉指定的警告。

在 module 下的 build.gradle 中添加 lintOptions{…}, 樣例代碼如下:

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
  }
}
...

自動刪除查找出來的無用資源文件

代碼迭代版本一多,很容易會遺留一些無用的代碼、資源文件,我們可以使用 Lint 進行清除。

點擊 Android Studio 工具欄 -> Analyze -> Run Inspection By Name..,輸入要檢測的內容,這裡是無用資源:

然後選擇 Unused resources,再選擇範圍後就開始檢測。

檢測出這麼多無用文件:

註意,右邊有解決方法:Remove All Unused Resources,放個大圖顯眼一點:

點擊後,將刪除所有的無用資源。

總結

Lint 是優秀程式員之友。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 配置Mysql Group Replication遇到的一些問題的記錄 ...
  • 重裝了一下系統,裝了centos7,但是centos7下預設沒有安裝mysql,有MariaDB資料庫,網上的解釋是: “MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL授權許可。開發這個分支的原因之一是:甲骨文公司收購了MySQL後,有將MySQL閉源的潛在風險 ...
  • 在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全局唯一。為此,MyCat 提供了全局 sequence,並且提供了包含本地配置和資料庫配置等多種實現方式, ...
  • 一. 使用sql提示 sql 提示(sql hint)是優化資料庫的一個重要手段, 是在sql語句中加入一些人為的提示來達到優化操作的目的。 1.1 use index 在查詢語句中表名的後面,添加use index 強制mysql使用該索引,不考慮其它索引。 1.2 ignore index 在查 ...
  • 先連接好資料庫,然後打開左側 對象資源管理器,選擇資料庫 右鍵單擊 > 選擇導入數據層應用程式 根據提示嚮導一步步走就行了 部分導入失敗以及處理方案 異常1 : 在資料庫master中拒絕 create database 許可權 處理方法:可能你當前登陸的用戶名沒有該許可權,可以直接使用Windows身 ...
  • 一、分支結構 1.If函數 語法:if(條件,值1,值2) 功能:實現雙分支 應用範圍:begin – 中 或者 外面 2.case結構 語法一:結構switch結構 case 變數或者表達式 when 值1 then 語句1; when 值2 then 語句2; … else 語法n; end c ...
  • Android四大組件 1、Activity a、Activity是指與用戶交互的界面。 b、一個Activity通常就是一個單獨的屏幕(視窗)。 c、Activity之間通過Intent傳遞數據。 2、service a、service在後臺運行,沒有圖形界面。 b、service的啟動方式有兩種 ...
  • 概述 有的時候需要在現有的項目上面開發一個新的項目,如果新建工程的話,就比較麻煩了,所以一般是直接現有的工程上面直接修改名字步驟如下: 1.修改工程名字 在這裡修改完之後,會彈出一個對話框,點擊Rename 2.修改Scheme名稱 點擊Xcode上面的工具欄Product Secheme Edit ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...