個案研究

Reddit 如何使用 R8 最佳化工具大幅提升效能

4 分鐘小故事
查看 Ben Weiss 的個人資料
Ben Weiss 開發人員關係工程師

在現今的行動應用程式世界中,流暢的使用者體驗不只是功能,更是必要條件。載入速度緩慢、介面沒有回應和不穩定,都可能嚴重影響使用者參與度和留存率。Reddit 的工程團隊與 Android 開發人員關係團隊合作,使用應用程式效能分數評估應用程式。評估效能後,他們發現有很大的改善空間,因此決定採取步驟,充分發揮 Android 應用程式最佳化工具 R8 的功能。這項專案成效顯著,不僅縮短啟動時間、減少影格凍結或緩慢情形和 ANR,也提升了 Play 商店評分。這份個案研究將詳細說明 Reddit 如何達成這些亮眼成果。

R8 最佳化工具如何協助 Reddit

R8 最佳化工具是 Android 效能最佳化的基礎工具。提升應用程式效能需要採取多項步驟,以下快速介紹其中最有效的幾項。

  • Tree shaking 是縮減應用程式大小最重要的步驟。系統會移除應用程式依附元件和應用程式本身未使用的程式碼。
  • 方法內嵌會將方法呼叫替換為實際程式碼,提高應用程式效能。
  • 類別合併和其他策略,讓程式碼更精簡。此時,重點不再是原始碼是否容易閱讀,而是讓編譯後的程式碼快速運作。因此,介面或類別階層等抽象概念在這裡並不重要,會遭到移除。
  • 縮減 ID:將類別、欄位和方法的名稱變更為較短且無意義的名稱。因此,您可能會得到名為 a 的類別,而不是 MyDataModel。
  • 資源縮減 :移除未使用的資源 (例如 XML 檔案和可繪項目),進一步縮減應用程式大小。
image.png

R8 最佳化的主要階段

從硬數據到使用者滿意度:找出實際執行環境中的成功案例

Reddit 向使用者推出新版應用程式後,成效立即有所提升。透過 Android Vitals 和 Crashlytics,Reddit 能夠在實際裝置上擷取實際使用者的成效指標,以便比較新版本與先前版本。

image.png

R8 如何提升 Reddit 的應用程式效能

團隊發現冷啟動速度提升 40% 、「應用程式無回應」(ANR) 錯誤減少 30% 、影格轉譯改善 25% ,以及應用程式大小縮減 14% 。

這些強化功能對提升使用者滿意度至關重要。啟動速度越快,等待時間就越短,使用者也能更快存取內容。ANR 越少,應用程式就越穩定可靠,使用者也越不容易感到不滿。影格轉譯更流暢,可消除 UI 卡頓,讓捲動和動畫效果更流暢、反應更靈敏。這項技術帶來的正面影響,也清楚反映在使用者觀感上。

Google Play 商店直接顯示了使用者滿意度指標,證明最佳化成效良好。推出 R8 最佳化版本後,團隊發現使用者觀感和參與度大幅提升。

image.png

Drew Heavner:「我們花了不到 2 週的時間,就充分發揮 R8 的潛力」

最令人印象深刻的是,這項成果是透過專注努力達成的。Reddit 的資深軟體工程師 Drew Heavner 負責這項計畫,他指出,實施變更以充分發揮 R8 的潛力,不到兩週就完成了。

確認成效:深入探討巨集基準

觀察到實際成效顯著提升後,Reddit 的工程團隊和 Google 的 Android 開發人員關係團隊進行了詳細的基準測試,以科學方式確認成效提升,並嘗試進一步最佳化。為了進行這項分析,Reddit 工程團隊提供了兩個版本的應用程式:一個未經最佳化,另一個則套用了 R8 和另外兩項基礎效能最佳化工具:基準設定檔和啟動設定檔。

基準設定檔可有效將 JIT 編譯步驟從使用者裝置移至開發機器。事實證明,產生的 Ahead Of Time (AOT) 編譯程式碼可縮短啟動時間,並減少轉譯問題。

封裝應用程式時,d8 dexer 會擷取類別和方法,並建構應用程式的 classes.dex 檔案。使用者開啟應用程式時,系統會逐一載入這些 DEX 檔案,直到應用程式啟動為止。提供啟動設定檔,即可讓 d8 知道要在第一個 classes.dex 檔案中封裝哪些類別和方法。這種結構可讓應用程式載入較少檔案,進而提升啟動速度。

Jetpack Macrobenchmark 是這個階段的核心工具,可在受控環境中精確評估使用者互動。為了模擬一般使用者歷程,他們使用 UIAutomator API 建立測試,開啟應用程式、向下捲動三次,然後向上捲動。

最後,編寫基準測試只需要以下內容:

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

基準資料證實了現場觀察結果,並提供更深入的洞察資訊。經過完整最佳化的應用程式啟動速度提升 55% ,使用者開始瀏覽的速度也提升 18% 。此外,最佳化應用程式的 JIT 編譯發生次數減少了三分之二,JIT 編譯時間也減少了三分之一。影格算繪作業有所改善,在基準使用者歷程中算繪的影格數量增加 19%。最後,應用程式的大小縮減了三分之一以上。

image.png

Reddit 的整體效能提升

您可以使用自訂 Macrobenchmark 追蹤區段指標,測量 JIT 編譯時間,如下所示:

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

啟用轉換背後的技術:R8

如要啟用 R8 完整模式,請在發布子版本中設定 app/build.gradle.kts 檔案,將 minifyEnabled 和 shrinkResources 設為 true。

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

完成這個步驟後,請務必進行全面的端對端測試,因為效能最佳化可能會導致不必要的行為,最好在使用者發現之前就先找出問題。

如本文先前所示,R8 會執行廣泛的最佳化作業,盡可能提升效能。R8 會大幅修改程式碼,包括重新命名、移動及移除類別、欄位和方法。如果發現這些修改造成錯誤,您必須在保留規則中宣告 R8 不應修改的程式碼部分。

在應用程式中仿效 Reddit 的做法

Reddit 採用 R8 獲得成功,是強而有力的案例研究,可供任何開發團隊參考,瞭解如何以低成本大幅提升應用程式效能。技術改善與使用者滿意度提升之間的直接關聯,突顯了效能最佳化的價值。

其他開發人員只要遵循本個案研究中的藍圖,使用應用程式效能分數等工具找出商機、充分發揮 R8 的最佳化潛力、監控實際資料,並使用基準確認及加深瞭解,就能獲得類似的成效。

如要在自己的應用程式中開始使用 R8,請參閱最新更新的官方說明文件和指南,瞭解如何啟用、設定 R8 最佳化工具,以及疑難排解相關問題。

作者:
繼續閱讀