Android代碼壓縮工具R8詳解 android.enableR8=true

前言

最近 Android Studio 穩定版迎來了3.3版本更新,帶來的新特性之一是新一代的代碼壓縮工具 R8,本文將詳細介紹這一新工具 R8。閱讀本文內容前需瞭解:html

關於 R8

做爲 Android 開發者,你們都知道縮減 APK 的大小是每一個項目都須要面臨的重要工做,而代碼縮減有助於經過移除未使用的代碼和資源來減小 APK 的大小,並使實際代碼佔用更少的空間(也稱爲混淆),因此 R8 這一項工具的目的是讓代碼縮減過程更快和更有效率。R8 目前已開源:android

R8 工具出現的背景和歷史

咱們開發者使用 Java 或者是 Kotlin 來編寫程序代碼,而後轉換爲 Android 設備所須要的 Dalvik 字節碼(.dex),整個過程能夠簡單的用下圖來表示: git

傳統的 Java 編譯器將源代碼編譯爲 Java 字節碼(.class)ProGuard 能夠選擇優化此代碼,從而生成更小,更快的 Java 字節碼。 dx 編譯器最終能夠將此 Java 字節碼轉換爲 Dalvik 字節碼(.dex)。 Dalvik 字節碼打包在 apk 文件中,最終安裝在設備上。 根據 Android 的版本,字節碼被及時(Dalvik VM),提早(ART)或二者的組合(Android P)解釋、編譯。 許多 Android 設備在處理能力,內存和帶寬方面存在許多限制因素,所以即便在當前,字節碼的大小和效率仍然很重要。 ProGuard 一般將字節碼大小減小 20-50%,並將字節碼性能提升多達 20%

對於開發者來講,構建過程的性能是很是重要的,所以在2015年,谷歌 Android 團隊引入了編譯器 Jack 和 Jill 。他們只需一步便可集成 Java 編譯器、ProGuard 和 Dalvik 編譯器的功能: github

它極大地簡化了構建過程,但對於使用 Java 字節碼的語言和工具的生態系統並無起到很好的做用。 Android 團隊在2017年放棄了它。使用新的 D8 編譯器,他們退後一步,只需用新的實現替換 dx 編譯器:
整個過程變得更加的溫和並適應外部工具,它仍然適應 Kotlin 語言。此外,D8 已經產生比 dx 更好的字節碼,具備更少的指令和更好的寄存器分配。

這仍然爲優化構建過程留下了空間,R8 是 D8 的衍生產品,旨在集成 ProGuard 和 D8 的功能工具

R8 和 Proguard

R8 一步到位地完成了全部的縮減(shrinking),去糖(desugaring)和 轉換成 Dalvik 字節碼(dexing )過程。性能

縮減(shrinking)過程實現如下三個重要的功能:gradle

  • 壓縮:從代碼中移除無用的類、段、方法等。
  • 優化:使代碼在指令級更小,更高效。
  • 混淆:使用簡短無心義的名稱重命名代碼裏剩餘的類,字段和方法。

R8 和當前的代碼縮減解決方案 Proguard 相比,R8 能夠更快地縮減代碼,同時改善輸出大小。下面將經過幾張數據圖來對比(數據源自於 benchmark): 優化

數據源自於 benchmark

如何使用 R8

R8 使用的方式很是簡單,Android Studio 升級到3.3及以上版本後,只需在項目的 gradle.properties 里加上:ui

android.enableR8=true
複製代碼

R8 普通模式是兼容 Proguard的,若原項目裏已使用了proguard,直接啓用 R8 便可。同時,R8 也有徹底模式,與Proguard不直接兼容。能夠在 gradle.properties 文件中另外設置如下內容:google

android.enableR8.fullMode=true
複製代碼

本文爲我的原創,轉載請註明出處。

相關文章
相關標籤/搜索