【问题标题】:Exclude some classes from Proguard's keep rules从 Proguard 的保留规则中排除某些类
【发布时间】:2011-11-07 14:55:59
【问题描述】:

我有一个即将使用 ProGuard 进行混淆的库。 “图书馆模式”几乎适用于我的用例,即保留所有公共和受保护的类和类成员几乎没问题。 然而,由于 Java 的可见性要求,一些成员不能被设置为包私有或私有,因此它们是公共类,尽管它们不应该在库中。我想让它们混淆以更清楚地表明这些类不属于公共 api,以及获得更好的混淆和更小的库 jar。 有没有办法从proguard“保留”规则中排除一些项目而不按名称指定这些项目中的每一个(使用'!')。 理想情况下,我想用标记注释来注释这些类和成员,但据我所知,Proguard 只能被告知 keep 带有某些注释的项目。

【问题讨论】:

  • 我最终对有问题的元素进行了注释,并编写了一个小型注释处理器,它转储 ProGuard 配置文件,使用我的自定义逻辑将所有要保留的成员一一列出:添加所有有效的公共/受保护成员没有那个注释。

标签: proguard


【解决方案1】:

您确实只能保留项。如果您想排除某些班级成员,您必须通过列出或注释您确实想要保留的班级成员来做到这一点。指定类名时,您可以提供一个列表,可选择使用“!”排除名称。在指定类成员名称和类型时,这是不可能的。不过,在这两种情况下,您都可以使用通配符。如果您为内部类选择特殊名称,这可能会起作用:

-keep public class * {
  public protected *** !myInternalField*;
  public protected *** !myInternalMethod*(...);
}

【讨论】:

  • 谢谢。将其标记为答案,虽然很遗憾它并没有真正回答我的问题,但告诉我它目前不受支持。
  • ! 不起作用:“预期的字段或方法名称”
猜你喜欢
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2017-04-24
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
相关资源
最近更新 更多