Proguard输出JAR文件无法执行

时间:2014-04-14 10:44:28

标签: java jar obfuscation proguard

我用Proguard来混淆我的.JAR文件。混淆后,JAR文件未执行。在反编译混淆代码时,我发现我的主方法已重命名。

原始代码:

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());
}

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

3 个答案:

答案 0 :(得分:0)

我没有测试过,但我读到Proguard删除了未使用的类。 试试这种方式 - 也许有帮助:

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

答案 1 :(得分:0)

我找到了解决方案(通过命中和试用)

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

public static void main(String[]args)

保存已编辑的类文件,它将保存为Java文件。编译它,并将其放回JAR文件中(使用Winrar)。

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

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

答案 2 :(得分:0)

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

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

请参阅ProGuard手册> Introduction

请参阅ProGuard手册>例子> A typical application