Proguard 中 -if 的含义

Posted

技术标签:

【中文标题】Proguard 中 -if 的含义【英文标题】:Meaning of -if in Proguard 【发布时间】:2021-12-18 21:30:14 【问题描述】:

对于下面的 Proguard 规则(取Kotlin Serialization)

-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> 
    static <1>$Companion Companion;

在上述规则的上下文中,-if 的含义是什么?我尝试查看官方 proguard 文档,但找不到任何相关信息

【问题讨论】:

【参考方案1】:

我编写了那些 ProGuard 规则。 :) pull request discussion about these changes may provide relevant background。

ProGuard rules documentation is quite sparse,我理解您的困惑。

-ifclass_specification

指定必须为present 的类和类成员才能激活后续的保留选项(-keep-keepclassmembers,...)。条件和随后的保留选项可以共享通配符和对通配符的引用。例如,您可以 在存在具有相关名称的类的条件下保留类 您的项目,使用 Dagger 和 Butterknife 等框架。

正如您复制的规则的 cmets 中所写:

# Keep `Companion` object fields of serializable classes.
# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects.
-if @kotlinx.serialization.Serializable class **
...

因此,-if @kotlinx.serialization.Serializable class ** 应理解为:对于所有应用了 @Serializable 注释的类(即“可序列化类”)。 -keepmembers 中的 &lt;1&gt; 随后指代 ** 通配符,即完全限定的类名。

【讨论】:

以上是关于Proguard 中 -if 的含义的主要内容,如果未能解决你的问题,请参考以下文章

新(空白)项目上的尴尬 Proguard 错误

DexGuard/Proguard 混淆注释值

为啥 proguard 不混淆方法体?

proguard 是不是将所有枚举转换为 int 或需要为此配置

使用 Gradle 和 ProGuard 构建的 Android:“输出 jar 必须在输入 jar 之后指定,否则将为空”

如何在 Eclipse 中混淆我的代码? (安卓)