Jetpack Compose 加速了 UI 開發, 使 Android 工程師 更有 生產力。 不過,在專案中加入新工具可能會影響 APK 以及建構和執行階段的效能,因此您必須將某些要素納入考量。
APK 尺寸 和 建構 時間
在 本節 中, 我們 會 比較 當 Jetpack Compose 新增 或 遷移時, 兩個 不同 應用程式的 影響:
- Tivi 完全 遷移 至 Compose, 移除 AppCompat 和 Material Design 元件 程式庫。
- Sunflower (
compose_recyclerview
分支) 加入 Compose 只使用 它 做為RecyclerView
的項目 之一。 所有 其他 依附元件 都 相同。
APK 尺寸
將 程式庫 加入 您的 專案, 會影響 APK 尺寸。 我們 來看看 Compose 對 上述 專案 尺寸 有何 影響。 下列 結果 適用於 各個 專案的 已縮小 釋出的 APK, 有了 資源 與 程式碼 縮減 得以 讓 使用 R8 完整 模式, 並使用 APK 分析工具進行 測量。
Tivi 發現 APK 尺寸 減少了 46%, 從 4.49 MB 降至 2.39 MB。此外, 完整 遷移至 Compose 後, 方法 數量 也 減少了 17%。 XML 程式碼 則 減少了 76%。
在專案中新增 Compose 時,Sunflower 的 APK 大小增加了 575 KB (從 2407 KB 增加到 2982 KB)。由於該 Sunflower 分支版本幾乎不會使用 Compose,因此專案無法享有 Compose 獨有的 APK 大小優勢,例如將 AppCompat 依附元件從專案中移除。
建構 時間
使用 相同的 專案, 讓我們一起 評估 Compose 對建構 效能的 影響。
這 考慮到 除錯 建構 時間, 也就是 您 在開發應用程式時 更關注的 問題。
在遷移至 Compose 之前, Tivi 的平均 建構 時間 為 108.71 秒。完全 遷移至 Compose 之後, 建構 時間 就下降 至 76.96 秒!建構 時間 減少了 29%。 此 時間縮減 是 因為 能夠 從 使用 kapt 註解 處理器 和 Hilt 在 AGP 7.0.中 加速的 專案中 移除 資料 連結 和 Epoxy。
但 Sunflower 卻花了 7.6% 的 中位數 建構 時間 (從 11.57 秒 至 12.45 秒)。
最終 想法
在應用程式中開始採用 Compose 時,APK 大小和建構時間都會增加。等到專案完全遷移至 Compose 後,APK 大小和建構時間就會縮減並超越原始指標。
執行階段效能
本節會說明 Jetpack Compose 執行階段效能的相關主題,讓您瞭解 Jetpack Compose 與 View 系統之間的效能差異,以及如何評估效能。
智慧 重組
當 UI 的部分 無效時, Compose 會 盡可能 重新編譯 需要 更新的 部分。 如要 進一步 瞭解 這個 主題, 請參閱 可組成 的 生命週期 指南。
與 「視野」 系統 進行比較
由於 View 系統的 設計 和 課程, Jetpack Compose 的表現 仍然 卓越。
所有 擴展 視野
在畫面上繪製的每個 View
(例如 TextView
、Button
或 ImageView
) 都需要記憶體配置、明確的狀態追蹤和各種回呼,才能支援所有用途。此外, 自訂 View
擁有者 必須 執行 明確的 邏輯, 避免 在 不需要時 重新 遮蓋 (例如, 重複 資料的 處理)。
Jetpack Compose 有幾種方式 可以 解決 這個 問題, Compose 沒有用於繪製檢視畫面的明確可更新物件,UI 元素是簡單的可組合函式,其資訊會以可重複使用的方式寫入 Composition。此做法 有助於 將 明確的 狀態 追蹤、 記憶體 分配 和 回呼 降低至 需要 特定 功能的 元件, 而非 所有 指定 View
類型的 擴充 功能。
此外, Compose 立即提供 智慧 重組,若是 不做 任何變更, 便會 重播 先前 繪製的 結果。
多重 配置 通行證
傳統的 ViewGroups 在評估 和 配置 API 方面 擁有 充分的 展現方式, 可讓 您 輕鬆 產生 多個 配置。 如果 是在 檢視 表階層的 特定 巢狀 點 執行, 這些 多重 配置 通行證 可能 會導致 指數的 工作。
Jetpack Compose 會根據 其 API 合約, 為 所有 配置 元件 強制 實行 單一 配置 通行證。 這讓 Compose 有效 處理 深度 UI 樹狀結構。 如果 需要 多個 測量 單位, Compose 有專用的 系統, 也就是 內建 測量單位。
查看 啟動 效能
當 首次 顯示 特定 配置時, View 系統 需要 加載 XML 配置。由於 Jetpack Compose 中的版面配置是採用 Kotlin 進行編寫,而編譯方式則與應用程式的其餘部分相同,因此可以省下這筆費用。
基準 組成
在 Jetpack Compose 1.0 中, 應用程式 在 debug
和 release
模式下的 效能 有顯著 差異。 在具代表性的時機剖析應用程式時,請一律使用 release
版本,而不是 debug
版本。
如要查看 Jetpack Compose 程式碼的執行效能,可以使用 Jetpack Macrobenchmark 程式庫。另外也歡迎參閱 MacrobenchmarkSample 專案,瞭解如何將該程式庫與 Jetpack Compose 搭配使用。Jetpack Compose 團隊也會透過這個程式庫偵測可能發生的任何迴歸問題,例如使用延遲資料欄基準和資訊主頁追蹤迴歸情形。
安裝 Compose 設定檔
由於 Jetpack Compose 是 未封裝的 程式庫, 因此 不利於 Zygote 預先載入 View 系統的 UI 工具包 類別 和 可繪圖。 Jetpack Compose 1.0 會使用 檔案 安裝 來進行 版本 建構作業。 檔案 安裝程式可讓 應用程式 在 指定的 安裝 時間 使 AOT 編譯 重要 程式碼。Compose 運輸 檔案 設定檔 規則, 以 減少 Compose 應用程式 中的 啟動時間 和 jank。