android - Proguard (R8) 混淆自定义 View 名称

标签 android proguard android-r8

我在我的应用程序中使用 R8 并且有几个自定义 View (在 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*();
}
因此,默认情况下,您的自定义 View 或任何 View 的名称不会被混淆。
现在的问题是,你还能让 R8 重命名应用程序中的自定义 View 吗? 答案是不是 .
您可以添加 -applymapping myCustomMapping.txt通过复制内容<root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt并替换对未使用混淆名称混淆的自定义 View 的所有引用。
像这样:
  • 复制<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 文件更改为混淆 CustomViewyoucantseemeatall , 但是 您的资源文件仍将引用原始 CustomView名称,您的应用程序将在运行时崩溃。
    结论:
    不幸的是,确实没有办法使用 proguard 或 Android Studio 附带的任何工具来完成您的要求。可能有一个自定义 Gradle 插件可以在组装应用程序之前更改所有自定义 View 名称,但我现在找不到一个只是谷歌搜索它。

    关于android - Proguard (R8) 混淆自定义 View 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62469583/

    相关文章:

    android - 如何使用 Google Drive 将文件从 Linux 传输到 Android

    android adb shell 权限被拒绝

    Android - multiDexKeepProguard 的目的是什么?它与 gradle 中关闭的 proguardFiles 相比如何?

    Android、proguard 和 paypal

    android - 如何为android数据绑定(bind)点击监听器编写proguard规则?

    android - R8 缩小 : Type defined multiple times

    android - 使用 R8 的 firebase 中的循环引用错误

    android - "java.lang.RuntimeException: Could not launch intent"用于具有不确定 ProgressBar 的 UI

    java - Android Studio 不允许我在字符串上使用开关?