【问题标题】:How to understand why R8 doesn't obfuscate code如何理解为什么 R8 不混淆代码
【发布时间】:2021-03-19 09:35:23
【问题描述】:

我正在使用 Android Gradle Plugin 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 不混淆代码?

【问题讨论】:

  • 在 Proguard 配置文件中添加“-printseeds /seeds.txt”和“-printusage /usage.txt”,如下所述:developer.android.com/studio/build/shrink-code 在此这样您就可以确定 ProGuard 是否真的选择保留这些类/变量。

标签: android android-gradle-plugin android-r8


【解决方案1】:

您在应用中使用的每个类都有一个保留规则。如果您有与某个类匹配的-keep 规则,它将被保留并且不会被混淆。用于重命名项目(类/字段和方法)的混淆,这些项目要么不必与保留规则匹配(或由带有修饰符 allowobfuscation 的保留规则匹配)。

只有通过反射查找的项目才需要保留规则,因此您必须将规则缩减为更小的集合。我建议您从一个空的proguard-rules.pro 开始,然后只获取getDefaultProguardFile('proguard-android-optimize.txt') 生成的内容(如here)。然后您的应用程序可能无法运行,但您可以找出问题所在并开始添加其他规则。开始的一种方法是仅将类保留在您自己的应用程序包 (-keep class ru.sbi.android.** { *; }) 中,因为库通常不需要保留规则,然后尝试进一步修剪。

也请查看Shrink, obfuscate, and optimize your app。

【讨论】:

  • 感谢您的回复!我已经评论了proguard-rules.pro 中的所有行并重建了项目。但是在反编译之后,我仍然没有得到混淆代码。
  • 当你说“得到不混淆的代码”时,你的意思是什么都没有被重命名?对于 Android 应用程序,存在无法重命名的入口点。请查看文件app/build/outputs/mapping/release/mapping.txt。它应该包含对您的应用程序所做的所有重命名(如果有)。该文件不包含任何信息吗?您还可以使用 proguard-rules.pro 中的选项 -printconfiguration ~/tmp/full-r8-config.txt 来获取已传递给 R8 的所有规则的收集列表,以仔细检查它们是否符合预期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 2019-11-19
  • 2015-11-17
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多