📜  Android中Proguard和R8之间的区别(1)

📅  最后修改于: 2023-12-03 14:59:17.036000             🧑  作者: Mango

Android中Proguard和R8之间的区别

在Android开发中,Proguard和R8都是常用的混淆工具。它们可以有效地缩小APK文件的大小,并且可以防止代码被反编译和篡改。那么Proguard和R8之间有哪些区别呢?本文将对此进行详细介绍。

Proguard

Proguard是一个常用的Java代码混淆器。在Android开发中,我们可以使用Proguard将Java代码进行混淆,最终生成一个混淆后的APK文件。Proguard的主要作用有:

  • 去除无用的class、method、field等
  • 将class、method、field等重命名,使其更难以反编译
  • 压缩代码,减小APK文件大小

在Android Studio中,我们可以通过以下方式开启Proguard:

  1. 在app/build.gradle文件中添加以下代码:
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
  1. 在app/proguard-rules.pro文件中添加你需要混淆的代码:
# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

# For most library modules (jar or aar), keep the following classes:
-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8
-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}
-keepattributes Signature
-keepattributes Annotation

# OkHttp3
-dontwarn okhttp3.**
-dontwarn javax.annotation.**
-keepattributes Signature
-keepattributes Annotation
-keepclassmembers class okhttp3.** {
    *;
}
-keepclassmembers class javax.annotation.** {
    *;
}

# Gson
-dontwarn org.xmlpull.v1.**
-keepattributes Signature
-keepattributes Annotation
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.stream.** { *; }
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.internal.UnsafeAllocator { *; }

# Proguard rules for Glide
-dontwarn com.bumptech.glide.integration.okhttp3.**
-dontwarn okhttp3.**
-keepattributes Signature
-keepattributes Annotation
-keep class com.bumptech.glide.integration.okhttp3.OkHttpGlideModule
-keep class com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader
-keep class com.bumptech.glide.load.model.GlideUrl
-keep class * implements com.bumptech.glide.module.GlideModule
-keep public class * implements com.bumptech.glide.module.* {
  public void registerComponents(android.content.Context, com.bumptech.glide.Glide, com.bumptech.glide.Registry);
}

Proguard虽然可以有效地混淆代码,但也存在一些缺点:

  • 需要手动配置混淆规则
  • 混淆规则容易出错
  • 混淆后的代码难以阅读和调试
  • 对编译速度和生成APK文件的大小有一定的影响
R8

R8是Google推出的全新代码混淆技术。与Proguard相比,R8有着更快的编译速度和更小的APK文件大小。并且,R8可以自动分析程序的依赖关系,自动生成混淆规则,大大降低了混淆规则的编写难度。在Android Studio 3.4及以上版本中,默认使用R8进行代码混淆,不需要手动开启。如果需要关闭R8,可以在app/build.gradle文件中添加以下代码:

android {
    buildTypes {
        release {
            useProguard true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled true
        // Sets Java compatibility to Java 8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}

由此可见,R8的使用非常简单,只需要在build.gradle文件中添加一行代码。与Proguard相比,R8有以下优点:

  • 自动分析程序的依赖关系,自动生成混淆规则,减少手动配置的工作量
  • 编译速度更快
  • 生成的APK文件更小
总结

Proguard和R8都是常用的代码混淆工具,都可以有效地缩小APK文件的大小,并且可以防止代码被反编译和篡改。相对而言,R8具有更快的编译速度和更小的APK文件大小,而且可以自动生成混淆规则,使用更加方便。因此,推荐使用R8进行代码混淆。