【问题标题】:Using ProGuard to obfuscate code使用 ProGuard 混淆代码
【发布时间】:2010-09-22 03:49:52
【问题描述】:

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

缩小

选项:

  • 收缩

保留:

  • 应用程序
  • 小程序

还要保留:

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

混淆

选项:

  • 混淆(呃!:P)
  • 严重超载
  • 使用唯一的类成员名称
  • 使用大小写混合的类名
  • 扁平化包层次结构
  • 重新打包类

保留名字:

  • 本机方法名称
  • .class 方法名

优化

选项:

  • 优化
  • 积极合并接口

删除:

  • [选中所有框]

信息

预验证和定位:

  • 预验证

一致性和正确性:

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

当我把罐子拿出来时:

我在启动时收到此小程序错误:

java.lang.RuntimeException:java.lang.NoClassDefFoundError:b 在 sun.plugin2.applet.Plugin2Manager.createApplet(未知来源) 在 sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(未知来源) 在 java.lang.Thread.run(未知来源) 引起:java.lang.NoClassDefFoundError: b 在 java.lang.Class.getDeclaredConstructors0(本机方法) 在 java.lang.Class.privateGetDeclaredConstructors(未知来源) 在 java.lang.Class.getConstructor0(未知来源) 在 java.lang.Class.newInstance0(未知来源) 在 java.lang.Class.newInstance(未知来源) 在 sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source) 在 java.awt.event.InvocationEvent.dispatch(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源) 引起:java.lang.ClassNotFoundException:b 在 sun.plugin2.applet.Applet2ClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) ... 14 更多 引起:java.io.IOException:打开HTTP连接失败:http://mystikrpg.com/b.class 在 sun.plugin2.applet.Applet2ClassLoader.getBytes(未知来源) 在 sun.plugin2.applet.Applet2ClassLoader.access$000(未知来源) 在 sun.plugin2.applet.Applet2ClassLoader$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) ... 17 更多 异常:java.lang.RuntimeException:java.lang.NoClassDefFoundError:b

这是混淆之前 jar 文件内部的内容clientOffline.jar

line_tile/
META-INF/

这是混淆到newOne.jar之后的那个jar文件:

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

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

【问题讨论】:

    标签: java applet obfuscation proguard


    【解决方案1】:

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

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

    注意事项是在 Java 编程时尝试使用 CamelCase 类名。

    【讨论】:

    • 嗯,我确实选中了保留名称选项。但应该是java -jar proguard.jar @myconfig.pro -verbose -keepnames 对吧?
    • “-keepnames class_specification”是正确的格式,在这种情况下,类规范可以是“class tileOffline”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2014-05-31
    相关资源
    最近更新 更多