使用ProGuard来混淆代码

时间:2010-09-22 03:49:53

标签: java applet obfuscation proguard

我选择了ProGuard,这是我配置的选项:

收缩

选项:

  • 收缩

保持:

  • 应用
  • 小程序

同时保持:​​

  • 枚举
  • 数据库驱动程序
  • Swing UI L& F

模糊处理

选项:

  • 混淆(duh!:P)
  • 积极过载
  • 使用唯一的班级成员名称
  • 使用混合casee类名称
  • 展平包层次结构
  • 重新包装类

保留姓名:

  • 原生方法名称
  • .class方法名称

优化

选项:

  • 优化
  • 积极合并界面

删除:

  • [检查所有方框]

信息

预先广告和定位:

  • 预验证

一致性和正确性:

  • 注意配置中的潜在错误
  • 警告可能有错误的输入
  • 跳过非公共图书馆类成员

当我拿起罐子并把它当作:

我在发布时遇到此applet错误:

    java.lang.RuntimeException: java.lang.NoClassDefFoundError: b
        at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
        at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.NoClassDefFoundError: b
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
        at java.lang.Class.getConstructor0(Unknown Source)
        at java.lang.Class.newInstance0(Unknown Source)
        at java.lang.Class.newInstance(Unknown Source)
        at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: b
        at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 14 more
    Caused by: java.io.IOException: open HTTP connection failed:http://mystikrpg.com/b.class
        at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
        at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
        at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        ... 17 more
    Exception: java.lang.RuntimeException: java.lang.NoClassDefFoundError: b

在混淆clientOffline.jar之前,这是jar文件中的内容:

line_tile/
META-INF/

以下是对newOne.jar的混淆之后该jar文件的内容:

line_tile/
META-INF/
weapon/
me.gif
a.class
b.class

我希望这足以帮助我解决这个问题。我做错了什么?

1 个答案:

答案 0 :(得分:2)

我猜b.class是从GamePanel内部类生成的。所以内部类可能存在问题。 Stackoverflow上的Here Tom提到他无法正确地混淆内部类。这里的建议也适用于:尝试使用verbose=true(或使用java -jar proguard.jar @ myconfig.pro -verbose)进行模糊处理。

我还建议对GamePanel和/或tileOffline使用-keepnames选项(参见manual),因为它会通过混淆保持这些类不变(至少是为了找到问题的根本原因)。

附注是在Java编程时尝试使用CamelCase类名。