在當今的行動應用程式世界中,流暢的使用者體驗不僅是功能,更是必要條件。載入速度緩慢、介面沒有回應,以及不穩定等問題,都可能大幅阻礙使用者參與度和留存率。Reddit 工程團隊與 Android 開發人員關係團隊合作時,使用「應用程式效能分數」評估應用程式。評估效能後,他們發現有大幅改善的潛力,因此決定採取行動,充分發揮 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% 。最佳化後的應用程式也顯示 Just in Time (JIT) 編譯發生次數減少三分之二,且 JIT 編譯時間減少三分之一。畫面顯示效能提升,因此在基準化使用者歷程中,顯示的畫面增加 19%。最後,應用程式大小縮減了超過三分之一。
Reddit 整體效能提升
您可以透過自訂 Macrobenchmark 追蹤記錄區段指標,測量 JIT 編譯時間,如下所示:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")
啟用轉型背後的技術:R8
如要啟用完整模式的 R8,請在發布子版本中,將 app/build.gradle.kts 檔案的 minifyEnabled 和 shrinkResources 設為 true,藉此設定 minifyEnabled 和 shrinkResources。
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 • 閱讀時間:2 分鐘
-
個案研究
TikTok 是全球知名的短片平台,擁有龐大的使用者群和創新功能。
Ben Trengrove, Ajesh Pai • 閱讀時間:2 分鐘
-
個案研究
在瞬息萬變的社群媒體世界中,使用者注意力稍縱即逝。Meta 應用程式 (Facebook 和 Instagram) 是全球最大的社群平台之一,為全球數十億使用者提供服務。
Mayuri Khinvasara Khabya • 4 分鐘可讀完
隨時掌握最新消息
每週透過電子郵件接收最新的 Android 開發洞察資料。