3

当我将以下“保留”规则放入我的 proguard 配置中时:

-keepclasseswithmembernames class ** implements com.my.package.MyInterfaceName { <fields>; }

起初,似乎我所有实现 MyInterfaceName 的类都保持其类名和字段不变。

但实际上在运行时,这些类使用 getSimpleName() 返回不同的简单名称。

以此为例:

public class Foo {
    public enum Bar implements MyInterfaceName { X, Y, Z }
}

X.getClass().getSimpleName()返回Foo$Bar而不是只Bar返回没有被proguard处理的。

4

2 回答 2

2

内部类就像其他类一样。ProGuard 会这样对待它们,例如在混淆它们的名称时。如果要保留嵌套结构,则必须保留相关的可选属性:

-keepattributes InnerClasses
于 2013-04-17T23:52:53.033 回答
0

Proguard 非常激进,并且删除了比需要更多的信息。幸运的是,由于您的配置行,全名没有改变,但对于简单的名称来说不是好消息。对于枚举的完整处理(它们还有一些需要保留的神奇方法),您应该查阅http://proguard.sourceforge.net/index.html#manual/examples.htmlProcessing enumeration classes上的部分

如果您的应用程序、applet、servlet、库等包含枚举类,则必须保留一些特殊方法。Java 5 中引入了枚举。java 编译器将枚举转换为具有特殊结构的类。值得注意的是,这些类包含运行时环境通过自省访问的一些静态方法的实现(这不是很宏大吗?自省是新一代的自修改代码)。您必须明确指定这些,以确保它们不会被删除或混淆:

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
于 2013-04-08T15:04:09.153 回答