如何理解为什么 R8 不混淆代码



我正在使用Android Gradle插件4.1.0和Gradle 6.5.1构建一个Android应用程序。在我的build.gradle文件中,标志minifyEnabled的值为true。这是我的proguard-rules.pro文件:

#rx
-dontwarn rx.**
-keep class rx.** { *; }
#retrofit / okhttp
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keep class okio.** { *; }
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
-dontwarn okhttp3.internal.platform.**
-dontwarn okio.**
-dontwarn org.conscrypt.**
#gson
-keepattributes SerializedName
-keep class com.google.gson.** { *; }
-keep class sun.misc.Unsafe { *; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers enum * { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepattributes *Annotation*
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault
-dontwarn javax.annotation.concurrent.GuardedBy
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
#guava
-dontwarn afu.org.checkerframework.checker.formatter.**
-dontwarn afu.org.checkerframework.checker.nullness.**
-dontwarn afu.org.checkerframework.checker.regex.**
-dontwarn afu.org.checkerframework.checker.units.**
-keep class * implements ru.surfstudio.android.network.Transformable
-keep class * implements ru.surfstudio.android.network.response.BaseResponse
-dontwarn com.bumptech.glide.**
#firebase crashlytics
-printmapping mapping.txt
-keepattributes *Annotation*,SourceFile,LineNumberTable
-keep public class * extends java.lang.Exception
-keep class com.google.firebase.crashlytics.** { *; }
-dontwarn com.google.firebase.crashlytics.**
#kotlin-reflect
#https://stackoverflow.com/questions/45871970/kotlin-reflect-proguard-smallsortedmap
-dontwarn kotlin.reflect.jvm.internal.**
#Cashoff javascript interface
-keep class ru.sbi.android.f_analytics.analytics.CashoffInteface { *; }
-dontwarn ru.sbi.android.f_main.R$id
-keep class ru.sbi.android.ui.navigation.MainTabType
#Cross-feature navigation keeps
-keep interface ru.sbi.android.ui.fragment.CrossFeatureFragment {*;}
-keep class * implements ru.sbi.android.ui.fragment.CrossFeatureFragment
#android standard
-keep class ru.surfstudio.android.rx.extension.ConsumerSafe { *; }
-keep class ru.surfstudio.android.rx.extension.ActionSafe { *; }
#AndroidPdfViewer
-keep class com.shockwave.pdfium.util.Size
#firebase
-dontwarn com.google.firebase.messaging.**
#android material
-keep class com.google.android.material.** { *; }
-dontwarn com.google.android.material.**
#Если вы хотите применять новый API Google API для отслеживания инициаторов
-dontwarn com.android.installreferrer.com.android.installreferrer
-ignorewarnings

我看到在构建过程中执行了许多minifyReleaseWithR8任务。

但是,当我使用apktool反编译生成的APK时,我发现所有的包、类和方法名称都与我的Android Studio中的相同。我怎么能理解为什么R8不混淆代码?

您在应用程序中使用的每个类都有一个保留规则。如果您有一个与类匹配的-keep规则,它将被保留,不会被混淆。对于模糊处理,重命名必须不由保持规则匹配(或由具有修饰符allowobfuscation的保持规则匹配(的项(类/字段和方法(。

保留规则只适用于通过反射查找的项目,因此您必须将规则精简为一个小得多的集合。我建议您从一个空的proguard-rules.pro开始,只得到getDefaultProguardFile('proguard-android-optimize.txt')生成的内容(就像这里一样(。然后你的应用程序可能无法工作,但你可以找出问题所在,并开始添加其他规则。开始的一种方法是只保留自己的应用程序包(-keep class ru.sbi.android.** { *; }(中的类,因为库通常不需要保留规则,然后尝试进一步修剪。

请看一下Shrink、模糊处理和优化您的应用程序。

最新更新