Proguard (R8) 混淆自定义视图名称

Proguard (R8) obfuscate custom view names

我在我的应用程序中使用 R8 并有几个自定义视图(在 xml 布局中引用)它们的名称根本没有混淆。有什么办法可以做到这一点?我正在使用标准 Gradle 规则:

release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }

也试过 android.enableR8.fullMode=true 但还是一样。

I am using R8 in my app and have several custom views (which are referenced in xml layouts) tho their names are not obfuscated at all.

这是因为 proguard-android-optimize.txt 具有以下规则:

# keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
    void set*(***);
    *** get*();
}

因此您的自定义视图或任何视图在默认情况下不会混淆其名称。

现在的问题是,您还能让 R8 重命名您应用中的自定义视图吗?答案是不是真的

您可以通过复制以下内容来添加 -applymapping myCustomMapping.txt <root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt 并替换对未使用混淆名称进行混淆的自定义视图的所有引用。 像这样:

  1. <root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt 的内容复制到一个新文件中 <root_dir>/app/myCustomMapping.txt
  2. 在更改任何内容之前,它将如下所示:
my.app.package.CustomView -> my.app.package.CustomView :
    13:34:void <init>(android.content.Context,android.util.AttributeSet,int) -> <init>
    15:16:void <init>(android.content.Context,android.util.AttributeSet,int,int,kotlin.jvm.internal.DefaultConstructorMarker) -> <init>
    43:46:void customMethod() -> c

  1. 您只需更改具有顶级 class 映射的这一行。请注意,由于 android proguard 规则,它没有发生变化。将其更改为您想要的任何混淆名称,如下所示:
my.app.package.CustomView -> my.app.package.youcantseemeatall :
    13:34:void <init>(android.content.Context,android.util.AttributeSet,int) -> <init>
    15:16:void <init>(android.content.Context,android.util.AttributeSet,int,int,kotlin.jvm.internal.DefaultConstructorMarker) -> <init>
    43:46:void customMethod() -> c
  1. 最后,将这些行添加到您的 proguard-rules.pro 文件
-applymapping myCustomMapping.txt
-printmapping mapping.txt

上述步骤会将您的 .class 文件更改为混淆 CustomViewyoucantseemeatall但是 您的资源文件仍将引用原始 CustomView 名称,您的应用程序将在运行时崩溃。

结论:

不幸的是,确实没有办法用混淆器或 Android Studio 附带的任何工具来完成您的要求。可能有一个自定义 Gradle 插件可以在应用程序组装之前更改所有自定义视图名称,但我现在只是用谷歌搜索找不到它。