即使使用 -keep,kotlin 类的构造函数中的参数名称也会被 proguard 删除

问题描述 投票:0回答:2

我有一个具有以下构造函数的类:

class Configuration @JvmOverloads constructor(val applicationId: String, typesToAutomaticallyLoad: List<AutoLoadableType>,
                                                    val isTestMode: Boolean = false, var userId: String? = null,
                                                    private var videoNetworks: List<MDNetwork> = MDNetwork.values().toMutableList(),
                                                    private var networks: List<MDAdNetwork> = MDNetwork.values().toMutableList(),
                                                    var loadingTimeoutMs: Long = 20000) 

我的 proguard 文件:

-keep class mypackage.** {
    <init>(...);
    *;
}

禁用 minify 后我得到:

   @JvmOverloads
   public Configuration(@NotNull String applicationId, @NotNull List typesToAutomaticallyLoad, boolean isTestMode, @Nullable String userId, @NotNull List videoNetworks, @NotNull List networks) {
      this(applicationId, typesToAutomaticallyLoad, isTestMode, userId, videoNetworks, networks, 0L, 64, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public Configuration(@NotNull String applicationId, @NotNull List typesToAutomaticallyLoad, boolean isTestMode, @Nullable String userId, @NotNull List videoNetworks) {
      this(applicationId, typesToAutomaticallyLoad, isTestMode, userId, videoNetworks, (List)null, 0L, 96, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public Configuration(@NotNull String applicationId, @NotNull List typesToAutomaticallyLoad, boolean isTestMode, @Nullable String userId) {
      this(applicationId, typesToAutomaticallyLoad, isTestMode, userId, (List)null, (List)null, 0L, 112, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public Configuration(@NotNull String applicationId, @NotNull List typesToAutomaticallyLoad, boolean isTestMode) {
      this(applicationId, typesToAutomaticallyLoad, isTestMode, (String)null, (List)null, (List)null, 0L, 120, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public Configuration(@NotNull String applicationId, @NotNull List typesToAutomaticallyLoad) {
      this(applicationId, typesToAutomaticallyLoad, false, (String)null, (List)null, (List)null, 0L, 124, (DefaultConstructorMarker)null);
   }

启用 minify 后我得到:

   @JvmOverloads
   public Configuration(@NotNull String var1, @NotNull List var2, boolean var3, @Nullable String var4, @NotNull List var5, @NotNull List var6) {
      this(var1, var2, var3, var4, var5, var6, 0L, 64, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public Configuration(@NotNull String var1, @NotNull List var2, boolean var3, @Nullable String var4, @NotNull List var5) {
      this(var1, var2, var3, var4, var5, (List)null, 0L, 96, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public Configuration(@NotNull String var1, @NotNull List var2, boolean var3, @Nullable String var4) {
      this(var1, var2, var3, var4, (List)null, (List)null, 0L, 112, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public Configuration(@NotNull String var1, @NotNull List var2, boolean var3) {
      this(var1, var2, var3, (String)null, (List)null, (List)null, 0L, 120, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public Configuration(@NotNull String var1, @NotNull List var2) {
      this(var1, var2, false, (String)null, (List)null, (List)null, 0L, 124, (DefaultConstructorMarker)null);
   }

所以这个 proguard 配置保留了类名、构造函数名称,但不保留参数名称。

如何让它也保留参数名称?

java android kotlin proguard
2个回答
0
投票

您必须添加 @SerializedName("...") 以及所有参数,

数据类SyncUser( @SerializedName(“用户”) 有效用户:用户 )


0
投票

这都是关于 Kotlin 元数据的。我在这里建议两件事:

  • 为 ProGuard/R8 添加该元数据文件的规则:
    -keep class kotlin.Metadata
    -keep,allowobfuscation class kotlin.Metadata { *; }
© www.soinside.com 2019 - 2024. All rights reserved.