在當今的行動應用程式世界中,流暢的使用者體驗不僅是功能,更是必要條件。載入速度緩慢、介面沒有回應,以及不穩定等問題,都可能大幅阻礙使用者參與度和留存率。在與 Android 開發人員關係團隊合作期間,Reddit 的工程團隊使用 App Performance Score 評估應用程式。評估成效後,他們發現有大幅改善的潛力,因此決定採取行動,充分發揮 Android 應用程式最佳化工具 R8 的效用。這項專案的成果相當顯著,不僅大幅縮短啟動時間,也減少了緩慢或凍結的影格和 ANR,Play 商店評分也整體提升。這項個案研究將詳細說明 Reddit 如何獲得如此亮眼的成果。
R8 最佳化工具如何協助 Reddit
R8 最佳化工具是 Android 效能最佳化的基礎工具,可透過各種步驟提升應用程式效能。現在就來快速瞭解其中影響最大的步驟。
- Tree shaking (移除沒用到的程式碼)是縮減應用程式大小最重要的步驟,可移除應用程式依附元件和應用程式本身未使用的程式碼。
- 方法內嵌會以實際程式碼取代方法呼叫,進而提升應用程式效能。
- 系統會套用類別合併和其他策略,讓程式碼更精簡。此時,原始碼的可讀性已不再重要,重點是讓編譯後的程式碼快速運作。因此,介面或類別階層等抽象概念在這裡並不重要,而且會遭到移除。
- 識別碼縮減會將類別、欄位和方法名稱變更為較短且沒有意義的名稱。因此,您可能會得到名為「a」的類別,而不是
MyDataModel。 - 資源縮減 功能會移除未使用的資源 (例如 XML 檔案和可繪項目),進一步縮減應用程式大小。
R8 最佳化的主要階段
從硬性資料到使用者滿意度:找出實際執行環境中的成功因素
新版應用程式推出後,Reddit 的成效立即有所提升。Reddit 運用 Android Vitals 和 Crashlytics,在實際裝置上收集實際使用者的效能指標,以便比較新推出與舊版。
R8 如何提升 Reddit 應用程式效能
團隊發現,應用程式的冷啟動速度提升 40% 、「應用程式無回應」(ANR) 錯誤減少 30% 、影格算繪效能提升 25% ,以及應用程式大小縮減 14% 。
這些強化功能對提升使用者滿意度至關重要。啟動速度越快,等待時間就越短,存取內容的速度也越快。ANR 減少代表應用程式更穩定可靠,可降低使用者挫敗感。畫面格算繪更順暢,可消除 UI 卡頓,讓捲動和動畫效果流暢且反應靈敏。這些正面技術影響也清楚反映在使用者的情緒上。
在 Google Play 商店中,可直接查看最佳化成效的使用者滿意度指標。推出 R8 最佳化版本後,團隊發現使用者情緒和參與度出現顯著正向的變化。
Drew Heavner:「啟用 R8 的完整潛力工具不到 2 週」
最令人印象深刻的是,這項成就的達成,完全是專注努力的成果。Reddit 負責這項計畫的軟體工程師 Drew Heavner 表示,實作這些變更以充分發揮 R8 的潛力,不到兩週就完成了。
確認改善程度:深入瞭解巨集基準測試
觀察到實際改善成效顯著後,Reddit 工程團隊和 Google 的 Android 開發人員關係團隊進行了詳細的基準測試,以科學方式確認成效提升,並嘗試進一步最佳化。在這次分析中,Reddit 工程團隊提供了兩個版本的應用程式:一個未經過最佳化,另一個則套用了 R8 和另外兩項基礎效能最佳化工具:基準設定檔和啟動設定檔。
基準設定檔可有效將即時 (JIT) 編譯步驟從使用者裝置移至開發人員電腦。生成的預先 (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% 。最後,應用程式大小縮減了超過三分之一。
Reddit 整體效能提升
您可以透過自訂 Macrobenchmark 追蹤記錄區段指標,測量 JIT 編譯時間,如下所示:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")啟用轉型背後的技術:R8
如要啟用完整模式的 R8,請在發布建構類型中,將 app/build.gradle.kts 檔案的 minifyEnabled 和 shrinkResources 和 shrinkResources 設為 true,藉此設定 app/build.gradle.kts 檔案。
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 最佳化工具的問題。
繼續閱讀
-
個案研究
Monzo 是英國的數位銀行,擁有 1, 500 萬名客戶,且人數持續增加。隨著應用程式規模擴大,工程團隊發現應用程式啟動時間是需要改善的關鍵領域,但擔心這會需要大幅修改程式碼集。
Ben Weiss, Tracy Agyemang • 閱讀時間:2 分鐘
-
個案研究
效能迴歸問題向來難以重現,因此對行動應用程式開發人員來說,迴歸問題是巨大的瓶頸。
-
個案研究
FotMob 最近在 Wear OS 上的安裝人數,創下 5 年來單日最大增幅,達到每日平均的 2 到 3 倍。秘訣是什麼?簡單的跨裝置安裝流程,可協助使用者直接透過手機探索 Wear OS 應用程式。
Garan Jenkin • 3 分鐘可讀完
隨時掌握最新消息
每週透過電子郵件接收最新的 Android 開發洞察資料。