📅  最后修改于: 2023-12-03 14:59:17.036000             🧑  作者: Mango
在Android开发中,Proguard和R8都是常用的混淆工具。它们可以有效地缩小APK文件的大小,并且可以防止代码被反编译和篡改。那么Proguard和R8之间有哪些区别呢?本文将对此进行详细介绍。
Proguard是一个常用的Java代码混淆器。在Android开发中,我们可以使用Proguard将Java代码进行混淆,最终生成一个混淆后的APK文件。Proguard的主要作用有:
在Android Studio中,我们可以通过以下方式开启Proguard:
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), '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虽然可以有效地混淆代码,但也存在一些缺点:
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有以下优点:
Proguard和R8都是常用的代码混淆工具,都可以有效地缩小APK文件的大小,并且可以防止代码被反编译和篡改。相对而言,R8具有更快的编译速度和更小的APK文件大小,而且可以自动生成混淆规则,使用更加方便。因此,推荐使用R8进行代码混淆。