Proguard实际上并没有保留我的班级(简单)名称,原因是什么?

时间:2013-04-08 13:31:45

标签: java proguard

当我在我的proguard配置中添加以下“keep”规则时:

-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处理。

2 个答案:

答案 0 :(得分:2)

内部类就像其他类一样。 ProGuard将它们视为例如,例如什么时候混淆了他们的名字。如果要保留嵌套结构,则必须保留相关的可选属性:

-keepattributes InnerClasses

答案 1 :(得分:0)

Proguard非常积极,并且删除了超出需要的更多信息。幸运的是,由于您的配置行,全名不会改变,但对于简单名称来说并不是好消息。要完整处理枚举(它们还有一些需要保留的神奇方法),您应该参考http://proguard.sourceforge.net/index.html#manual/examples.html

上的Processing enumeration classes部分。
  

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

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}