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

Posted

技术标签:

【中文标题】Proguard (R8) 混淆自定义视图名称【英文标题】:Proguard (R8) obfuscate custom view names 【发布时间】:2020-10-09 16:01:21 【问题描述】:

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

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

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

【问题讨论】:

您的意思是这些名称在 xml 布局文件或 .class 文件中没有被混淆? 嗨,两者都没有混淆。我希望他们两者兼而有之。这可能吗? 【参考方案1】:

我在我的应用程序中使用 R8,并且有几个自定义视图(在 xml 布局中引用),但它们的名称根本没有被混淆。

这是因为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 并替换所有对未使用混淆名称混淆的自定义视图的引用。 像这样:

    <root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt的内容复制到一个新文件<root_dir>/app/myCustomMapping.txt 在更改任何内容之前,它将如下所示:
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

    您只需要更改具有***类映射的这一行。请注意,由于 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
    最后,将这些行添加到您的 proguard-rules.pro 文件中
-applymapping myCustomMapping.txt
-printmapping mapping.txt

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

结论:

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

【讨论】:

我还应该提到,没有办法扩展 R8/proguard mapping.txt。你只能用你自己的替换它。因此,每次更新源代码时都必须重复步骤 1-4。 R8/Proguard 确实让在没有第三方工具的情况下自定义混淆名称变得很痛苦。 感谢您的信息,非常感谢。

以上是关于Proguard (R8) 混淆自定义视图名称的主要内容,如果未能解决你的问题,请参考以下文章

保留规则的 Proguard/R8 例外

Firebase + Proguard/R8

如何修复因 ProGuard/R8 导致的崩溃?

Android R8(Proguard) 参数名称已更改(我不想更改我的参数名称)

为类、成员和参数混淆 Proguard 自定义命名

Proguard和R8有啥区别?