【发布时间】:2013-08-12 23:16:58
【问题描述】:
我在运行我的混淆 jar 时遇到问题,当我尝试运行它时收到“Java 虚拟机启动器”消息“发生 Java 异常”。 (此错误是弹出窗口,不在命令行上)我尝试从命令行运行并从 jvm 控制台打印堆栈跟踪,但没有看到任何异常。
所以我做了一些故障排除:我禁用了收缩、混淆和优化,以便输出(应该)与输入相同。结果是输出 jar 比输入少几个 KB。我提取了两个 jar,反编译了 .class 文件,并比较了每个文件的源代码和 MANIFEST.MF,它们都是一样的*!
我正在使用 ProGuard 4.10、JDK 1.7.0_25 x64 和 Windows 8。我正在构建一个相当复杂的 JavaFX 程序,并且我相信我正确配置了 ProGuard——但如果缩小、混淆和优化是无关紧要的都是残疾人,对吧?以下是 ProGuard 给我的注释:
Note: duplicate definition of library class [netscape.javascript.JSException]
Note: duplicate definition of library class [netscape.javascript.JSObject]
Note: com.javafx.main.Main accesses a field 'HKEY_LOCAL_MACHINE' dynamically
Note: com.javafx.main.Main accesses a field 'HKEY_LOCAL_MACHINE' dynamically
Note: com.javafx.main.Main accesses a declared method 'reset()' dynamically
Note: com.javafx.main.Main$2 accesses a field 'ERROR_MESSAGE' dynamically
当我第一次尝试混淆时,我跳过了 com.javafx.main.** 但我仍然收到了这些消息。任何帮助将不胜感激。在 ProGuard 处理之前,我运行我的 jar 没有问题。谢谢。
*编辑:在进行二进制比较时,清单文件不同(原始文件较长),但在进行 ASCII 比较时,两个文件是相同的。所有其他文件完全相同。两个 MANIFEST.MF 文件的区别在于 PC 与 UNIX 换行符。
*EDIT2:我使用 -jar 选项运行文件,但确实得到了明确的异常!
java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
从com.javafx.main.Main这里是ERROR_MESSAGE和HKEY_LOCAL_MACHINE的使用:
int ERROR_MESSAGE = ERROR_MESSAGE_Field.getInt(null);
Method showMessageDialogMethod = jOptionPaneClass.getMethod("showMessageDialog", new Class[] { componentClass, Object.class, String.class, Integer.TYPE });
showMessageDialogMethod.invoke(null, new Object[] { null, this.val$string, "JavaFX Launcher Error", new Integer(ERROR_MESSAGE) });
...
Field HKEY_LOCAL_MACHINE_Field = winRegistryClass.getField("HKEY_LOCAL_MACHINE");
int HKEY_LOCAL_MACHINE = HKEY_LOCAL_MACHINE_Field.getInt(null);
String path = (String)mGet.invoke(null, new Object[] { new Integer(HKEY_LOCAL_MACHINE), "Software\\Oracle\\JavaFX\\" + version, "Path" });
【问题讨论】:
-
按照 ProGuard 手册中的说明,你做了什么来搜索类方法 forName、getMethod、getField 等方法的使用?
-
@rcook 我通过不处理 any 类的 any 方法验证了这些 Class 方法没有被处理。事实上,我禁用了所有混淆,反编译生成的 jar 并验证所有源文件都没有改变。我可能不明白你的评论,或者你可能不明白我的问题。有没有人遇到过这样的问题?谢谢。
-
我指的是程序,而不是 ProGuard。程序是否在任何 forName() 或反射形式中使用了 reset() 或 ERROR_MESSAGE?
-
我不知道该怎么做。我的课程都没有使用 reset() 或 ERROR_MESSAGE。在 Netbeans 中编译我的 javafx 程序,它添加了 com.javafx.main.Main 和 com.javafx.main.NoJavaFXFallback。这些类都没有使用 reset() 方法,只有 javafx.main.Main 使用 ERROR_MESSAGE(我将在上面发布代码)
标签: java jar javafx obfuscation proguard