自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android 中的 R8詳解

移動開發(fā) Android
Google 發(fā)布了 R8 來作為 Proguard 的替代品,用以幫助開發(fā)人員通過生成更好的輸出 (APK) 來縮減代碼。與 Proguard 相比,R8 被認為要比Proguard要快得多。

Google 發(fā)布了 R8 來作為 Proguard 的替代品,用以幫助開發(fā)人員通過生成更好的輸出 (APK) 來縮減代碼。與 Proguard 相比,R8 被認為要比Proguard要快得多。

1、什么是R8?

  • R8 是一個將我們的 java 字節(jié)碼轉換為優(yōu)化的 dex 碼的工具。
  • 它遍歷整個應用程序,然后對其進行優(yōu)化,例如刪除未使用的類、方法等。
  • 它在編譯時運行。它可以幫助我們減少構建的大小并使我們的應用程序更加安全。
  • R8 使用 Proguard 規(guī)則來修改其默認行為。

(1)開啟R8的好處

  • 代碼縮減(搖樹優(yōu)化):使用靜態(tài)代碼分析來查找和刪除無法訪問的代碼和未實例化的類型,對規(guī)避 64k 引用限制非常有用。
  • 資源縮減:移除不使用的資源,包括應用庫依賴項中不使用的資源。
  • 混淆代碼:縮短類和成員的名稱,從而減小 DEX 文件的大小
  • 優(yōu)化代碼:檢查并重寫代碼,選擇性內聯(lián),移除未使用的參數(shù)和類合并來優(yōu)化代碼大小.
  • 減少調試信息 : 規(guī)范化調試信息并壓縮行號信息
  • R8 會自動執(zhí)行上述編譯時任務,也可以停用某些任務或通過 ProGuard 規(guī)則文件自定義 R8 的行為。
  • 使用某個第三方庫時,通常只使用其中很小一部分。若不壓縮,所有庫代碼都會保留在應用中。冗長的代碼有時可以提高可讀性和可維護性。

2、R8 怎么用

(1)R8 編譯器主要作用有:

  • 代碼縮減(即搖樹優(yōu)化)從應用及其庫依賴項中檢測并安全地移除不使用的類、字段、方法和屬性(這使其成為了一個對于規(guī)避 64k 引用限制非常有用的工具)。例如,如果你僅使用某個庫依賴項的少數(shù)幾個 API,那么縮減功能可以識別應用不使用的庫代碼并僅從應用中移除這部分代碼。
  • 資源縮減:從封裝應用中移除不使用的資源,包括應用庫依賴項中不使用的資源。此功能可與代碼縮減功能結合使用,這樣一來,移除不使用的代碼后,也可以安全地移除不再引用的所有資源。
  • 優(yōu)化:檢查并重寫代碼,以進一步減小應用的 DEX 文件的大小。例如,如果 R8 檢測到從未采用過給定 if/else 語句的 else {} 分支,則會移除 else {} 分支的代碼。
  • 混淆:使用無意義的簡短名稱重命名類、方法和字段,增加逆向難度,并且縮短類和成員的名稱,從而減小 DEX 文件的大小。

(2)啟用與禁用 R8

如需啟用縮減、混淆處理和優(yōu)化功能,請在項目級 build.gradle 文件中添加以下代碼:

android {
buildTypes {
release {
// Enables code shrinking, obfuscation, and optimization for only
// your project's release build type.
//啟用 R8 的代碼縮減功能
minifyEnabled true
// Enables resource shrinking, which is performed by the
// Android Gradle plugin.
//啟用 R8 的資源縮減功能
shrinkResources true
// Includes the default ProGuard rules files that are packaged with
// the Android Gradle plugin. To learn more, go to the section about
// R8 configuration files.
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
...
}

關閉R8,gradle.properties中添加配置

# 顯式啟用 R8
android.enableR8 = true
# 只對 Android Library module 停用 R8 編譯器
android.enableR8.libraries = false
# 對所有 module 停用 R8 編譯器
android.enableR8 = false

R8 普通模式是兼容 Proguard 的,若原項目里已使用了 Proguard,直接啟用 R8 即可。同時,R8 也有完全模式,但是與 Proguard 不直接兼容,可以在 gradle.properties 文件中另外設置以下內容開啟:

android.enableR8.fullMode=true

額外的優(yōu)化功能會使 R8 的行為與 ProGuard 不同,因此可能會需要您添加額外的 ProGuard 規(guī)則,以避免運行時問題

(3)自定義要保留的代碼

強制 R8 保留某些代碼,在 ProGuard 規(guī)則文件中添加 -keep 代碼行,如

-keep public class MyClass

為要保留的代碼添加 @Keep 注解

  • 在類上添加 @Keep 可按原樣保留整個類。
  •  在方法或字段上添加該注釋,將使該方法/字段(及其名稱)以及類名稱保持不變。
  • 只有在使用 AndroidX 注解庫且您添加 Android Gradle 插件隨附的 ProGuard 規(guī)則文件時,此注解才可用。

3、R8 與 Proguard 的比較

  • 對于使用 3.4.0 或更高版本的 Gradle 插件的 Android 應用,項目默認使用R8,不再使用Proguard進行優(yōu)化。但是,它只使用 Proguard 規(guī)則。
  • R8 有效地內聯(lián)容器類并刪除未使用的類、字段和方法。Proguard 將應用程序大小減少了 8.5%,與 R8 相比減少了 10% 的代碼.
  • 與 Proguard 相比,R8 對 Kotlin 的支持更多。
  • R8 提供比 Proguard 更好的輸出,并且比 Proguard 更快,從而減少了整體構建時間。

(1)比較一下 Proguard 和 R8的性能

Proguard:

圖片

在使用 Proguard 時,應用程序代碼由 Java 編譯器轉換為 Java 字節(jié)碼。轉換后,Proguard 使用我們編寫的規(guī)則對其進行優(yōu)化。然后 dex 將其轉換為優(yōu)化的 Dalvik 字節(jié)碼。

將其轉換為 Dalvik 字節(jié)碼大概需要 4 個步驟。

R8:

圖片

  • 在使用 R8 時,首先將應用程序的代碼通過 java 編譯器轉換為 Java 字節(jié)碼,然后直接使用 R8 將 Java 字節(jié)碼轉換為 Dalvik 字節(jié)碼。
  • 通過使用 R8,它直接將 Java 字節(jié)碼轉換為 Dalvik 字節(jié)碼的步驟從 2 減少到 1。
  • 與 R8 相比,Proguard 應用了 520 個窺孔優(yōu)化,后者非常少。窺孔優(yōu)化是對一組編譯器生成的代碼執(zhí)行的優(yōu)化,通過使代碼更短、更快來提高代碼的性能。
  • 在 Proguard 和 R8 中,我們必須通過編寫自定義配置來處理反射。
  • 在轉換代碼的執(zhí)行上,R8 比 Proguard 更快。
責任編輯:姜華 來源: Android開發(fā)編程
相關推薦

2022-06-02 16:46:25

京東APP升級Android升級AGP

2013-06-28 14:00:28

Android

2021-11-24 08:33:09

Android廣播機制應用程序

2010-10-28 14:29:03

PowerShellServer2008

2009-12-11 09:15:13

2010-04-30 15:53:20

2012-11-28 10:54:33

Windows 8快速啟動

2017-05-02 09:16:20

RPython文本挖掘

2017-04-29 09:45:03

Python挖掘數(shù)據(jù)

2020-12-07 13:48:48

EditorAndroid開發(fā)者

2011-07-27 09:44:32

Server 2008iSCSI

2013-04-22 13:51:08

Android開發(fā)Android中App

2014-05-27 15:36:01

AndroidActivity啟動模式

2011-09-09 13:47:48

Android Wid

2022-01-16 08:00:28

PythonFor循環(huán)

2014-07-11 09:33:24

iOS 8動作擴展

2011-02-18 14:02:36

Android R5 Android NDKAndroid NDK

2013-05-08 10:36:07

JavaScriptJS詳解JavaScrip

2019-03-04 08:14:35

LinuxIDBash

2009-02-18 13:21:04

點贊
收藏

51CTO技術棧公眾號