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

问题描述:

当我把下面的“保存”的规则在我的ProGuard配置: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的被处理返回。

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

-keepattributes InnerClasses 

Proguard正在非常积极地消除比需要更多的信息。幸运的是,全名不会改变,这要归功于您的配置行,而不是简单名称的好消息。对于全处理枚举(他们有一些神奇的方法也是需要保留),你应该在http://proguard.sourceforge.net/index.html#manual/examples.html

咨询Processing enumeration classes部分如果你的应用程序,小程序,小服务程序,库等,包含 枚举类,你必须保留一些特殊的方法。枚举是在Java 5中引入的.java编译器将 枚举转换为具有特殊结构的类。值得注意的是, 类包含了 运行时环境访问由内省一些静态方法实现(这不只是盛大? 反省是新一代的自修改代码)。您 必须明确指定,以确保它们不会被删除或 混淆:

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

经过一些测试后,恐怕这并不能解决我的问题。但Eric Lafortune提供的另一种解决方案确实有效。 – 2013-04-18 14:51:15