【问题标题】:Proguard does not actually keep my class (simple) name, what's the cause?Proguard 实际上并没有保留我的类(简单)名称,这是什么原因?
【发布时间】:2013-04-08 13:31:44
【问题描述】:

当我将以下“保留”规则放入我的 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处理。

【问题讨论】:

    标签: java proguard


    【解决方案1】:

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

    -keepattributes InnerClasses
    

    【讨论】:

    • 我只想混淆我的课程。请建议我怎么做?
    【解决方案2】:

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

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

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

    【讨论】:

    • 经过一些测试,恐怕这并不能解决我的问题。但 Eric Lafortune 提供的其他解决方案确实有效。
    猜你喜欢
    • 2012-06-13
    • 2022-01-18
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2014-05-02
    相关资源
    最近更新 更多