com.apple.eawt.Application在混淆后无法正常工作

时间:2012-06-05 11:51:38

标签: java windows macos obfuscation

我已经用Java编写了一个适用于Mac OSx和Windows的应用程序,但我在Windows上开发了它。因此,我使用java.lang.reflect.*来实现“关于”和“退出”处理程序,而不会收到异常。

我已将其导出为可执行文件夹,并且在两个操作系统上一切正常。但是,我想混淆应用程序,我正在使用ProGaurd这样做。我已指定必要的库在Windows上运行(rt.jar,jsse.jar,jce.jar),它在Windows上仍能正常工作,但是ProGaurd告诉我有两个未解析的类动态引用或者接口和混淆的应用程序在Mac上不再正常工作(关于和退出处理程序不起作用)。

我在某处读到ui.jar是必需的,所以我将它从我的Mac上复制并在ProGaurd中指定,但似乎没有解决问题!任何解决方案都值得赞赏...

提前致谢

更新

我现在使用AppleJavaExtensions来使用com.apple.eawt.Application来实现处理程序而不是反映。但是,我仍然遇到了完全相同的问题!以下是我目前使用的代码:

package ap;
import com.apple.eawt.AboutHandler;
import com.apple.eawt.AppEvent;
import com.apple.eawt.AppEvent.QuitEvent;
import com.apple.eawt.Application;
import com.apple.eawt.QuitHandler;
import com.apple.eawt.QuitResponse;
import com.gui.Tabs;

public class xa implements AboutHandler, QuitHandler {

    // Constructor to register/install the necessary handler's
    public xa(){
        Application.getApplication().setAboutHandler(this);
        Application.getApplication().setQuitHandler(this);
    }

    // Implemented method to catch the About menu item
    @Override
    public void handleAbout(AppEvent.AboutEvent e) {
        Tabs.switchAbout();

    }

    // Implemented method to catch the Quit menu item
    @Override
    public void handleQuitRequestWith(QuitEvent arg0, QuitResponse arg1) {
        Tabs.quit();        
    }
}

我正在使用ProGuard GUI来混淆我的应用程序。在底部的Obsfucation'标签'中,我添加了类ap.xa并指定它扩展/实现AboutHandler, QuitHandler。我还添加了类com.gui.Tabs,但问题仍然存在。

4 个答案:

答案 0 :(得分:1)

也许你可以试试Apple Java Extensions

使用Apple Java Extensions,您可以在不使用java.lang.reflect.*类的情况下在Windows上进行开发,也许ProGuard会更容易。

答案 1 :(得分:0)

如果您告诉ProGuard不要混淆实现About和Quit处理程序的类,会有帮助吗?

答案 2 :(得分:0)

尝试使用-dontoptimize选项。有些方法在没有效果的情况下被移除。"并在Windows上执行ProGuard ...适用于Mac。或者是一个愚蠢的选择:尝试在Mac上进行模糊处理并提供两个版本。

答案 3 :(得分:0)

Opps,我已经解决了这个问题...... 而我只是犯了一个愚蠢的错误

由于我使用的是ProGuard GUI,因此无法在添加屏幕中看到“类成员”部分。因此,虽然ProGuard没有混淆类本身,但是它混淆了方法,因此听众无法工作。所以,我最终'保持'ap.xa及其所有方法(包含实际侦听器的类)和com.apple.**(JavaAppleExtensions包)

然而,仍然有一件事发生。当我从终端I运行混淆的JAR文件时,会收到以下输出:

Andrews-MacBook-Pro:~ Andy$ java -jar /Users/Andy/Desktop/YLIT\ Final\ 2.jar
Jun  9 20:50:29 Andrews-MacBook-Pro.local java[959] <Error>: CGContextGetCTM: invalid context 0x0
Jun  9 20:50:29 Andrews-MacBook-Pro.local java[959] <Error>: CGContextSetBaseCTM: invalid context 0x0
Jun  9 20:50:29 Andrews-MacBook-Pro.local java[959] <Error>: CGContextGetCTM: invalid context 0x0
Jun  9 20:50:29 Andrews-MacBook-Pro.local java[959] <Error>: CGContextSetBaseCTM: invalid context 0x0