【问题标题】:Proguard output JAR file cannot be executedProguard 输出 JAR 文件无法执行
【发布时间】:2014-04-14 10:44:28
【问题描述】:

我使用 Proguard 来混淆我的 .JAR 文件。混淆后,JAR 文件没有执行。在反编译混淆代码时,我发现我的 main 方法被重命名了。

原代码:

public static transient void main(String args[])
{
    SwingUtilities.invokeLater(new  Object()     /* anonymous class not found */
    class _anm1 {}
    );
}

混淆代码:

public static transient void a(String as[])
{
    SwingUtilities.invokeLater(new aa());
}

我取消了混淆选项卡中的所有选项,但仍然没有运气! 有什么帮助吗?

【问题讨论】:

  • 你能发布你的 proguard 设置吗?

标签: java jar obfuscation proguard


【解决方案1】:

默认情况下,ProGuard 会重命名甚至删除代码中的所有类、字段和方法。您需要保留代码的入口点。在简单应用程序的情况下,入口点是主类及其主方法。在您的 ProGuard 配置中:

-keep public class mypackage.MyMain {
    public static void main(java.lang.String[]);
}

参见 ProGuard 手册 > Introduction

参见 ProGuard 手册 > 示例 > A typical application

【讨论】:

  • 我使用的是 GUI 版本的 Proguard。我需要在配置脚本中编辑它吗?
  • GUI在“Shrinking”选项卡中有相应的设置“Keep Applications”。它是默认设置的。
【解决方案2】:

我没有对此进行测试,但我读到 Proguard 删除了未使用的类。 尝试这种方式 - 也许会有所帮助:

public static transient void main(String args[])
{
    SwingUtilities.invokeLater(new  Object()     /* anonymous class not found */
    class _anm1 {}
    );
    new _anm1();
}

【讨论】:

  • 如何将包含 main 的类视为“未使用”?
  • 因为没有创建 _anm1 类的对象。
【解决方案3】:

我已经找到了解决方案(通过点击和试用)

实际上,Progaurd 以这样一种方式进行混淆,即所有方法都重命名为 a、b、c 和更简单的名称。这适用于所有方法,包括主要方法(如上所示)。因此,在从 jar 文件中提取(使用 Winrar 或类似实用程序)后打开混淆类(使用反编译器,我更喜欢 Cavaj Decompiler)。编辑文件并将 main 方法重命名为

public static void main(String[]args)

保存编辑的类文件,它会被保存为Java文件。编译它,然后把它放回 JAR 文件中(使用 Winrar)。

现在执行类文件。如果类文件不起作用,请编辑您的 Manifest,因为类(有时包)在混淆后被重命名,并且此类更改不会反映在 Manifest 中。

这对我有用,如果有人仍然面临任何问题,请发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多