当我在我的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处理。
答案 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);
}