如何防止 Java 应用程序创建托盘图标?

如何防止 Java 应用程序创建托盘图标?

从 Ubuntu 13.04 开始,将某些应用程序列入白名单(并因此列入黑名单)以防止其创建托盘图标的可能性已经消失。从那时起,Java 应用程序的托盘图标和 Wine 图标都是硬编码的,并且始终可见。

尽管某些 ppa 通过返回 systray.whitelist 提供了统一补丁(但目前还不适用于 14.04),但我想知道是否还有其他方法可以隐藏 Java 应用程序的托盘图标(例如 JDownloader)

我知道有一种方法可以为 qt 应用程序实现这一点,即通过实施 apparmor-profiles 来拒绝对 sni-qt 包的读取访问(例如 Skype 或 Spotify)

有没有办法为 Java 应用程序和/或 Wine 应用程序实现 apparmor 配置文件或类似的东西?

谢谢

答案1

对于 Java 应用程序:

  • 实际上,对于 JDownloader 来说,它是一种模块化设计。托盘图标作为插件提供,可以通过以下方式禁用:

    JDownloader → 插件 → 插件管理器 → 扩展 → 取消选中启用盒子JD 轻型托盘

  • 对于 Java 应用程序一般情况,可以通过编写自定义策略规则来使用 Java 安全管理器。

    1. 创建java.policy文件~/.jdownloader包含:

      grant codeBase "file:/home/user/.jdownloader/-" {
      
      // full access
      //    permission java.security.AllPermission;
      
      // AWTPermission full or only selected elements from it
      //    permission java.awt.AWTPermission "*";
      
          permission java.awt.AWTPermission "accessClipboard";
          permission java.awt.AWTPermission "accessEventQueue";
      //    permission java.awt.AWTPermission "accessSystemTray";
          permission java.awt.AWTPermission "createRobot";
          permission java.awt.AWTPermission "fullScreenExclusive";
          permission java.awt.AWTPermission "listenToAllAWTEvents";
          permission java.awt.AWTPermission "readDisplayPixels";
          permission java.awt.AWTPermission "replaceKeyboardFocusManager";
          permission java.awt.AWTPermission "setAppletStub";
          permission java.awt.AWTPermission "setWindowAlwaysOnTop";
          permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
          permission java.awt.AWTPermission "toolkitModality";
          permission java.awt.AWTPermission "watchMousePointer";
      
      // Added by try and learn
          permission java.io.FilePermission "/-", "read,write,delete";
          permission java.util.PropertyPermission "*", "read,write";
          permission java.util.logging.LoggingPermission "control";
          permission java.lang.RuntimePermission "*";
          permission java.net.NetPermission "*";
          permission java.security.SecurityPermission "*";
          permission javax.net.ssl.SSLPermission "*";
          permission java.net.SocketPermission "*", "connect,resolve";
          permission java.lang.reflect.ReflectPermission "*";
      };
      
    2. 修改jdownloader启动脚本以使用自定义策略

      sudo nano /usr/bin/jdownloader
      

      添加:-Djava.security.manager -Djava.security.policy=java.policy到java命令调用:

      exec java ${JAVA_OPTIONS}  -Djava.security.manager -Djava.security.policy=java.policy -jar JDownloader.jar $*
      

这些是允许我启动 jdownloader 的最低规则。您可能需要添加更多权限。因为没有deny选项,所以您必须编写所有必要的grant规则。

参考:

//顺便说一句,尝试通过在行首添加注释来注释其中一条规则;这样您就可以看到拒绝权限的错误是什么样子的。它会告诉您应该添加哪个权限。还请注意,我已经使用了很多规则-*试图扩展规则,因为我正在寻找一个快速解决方案(AllPermission无论如何都是默认的),而且我并不想让应用程序坐牢。

这是一个开始的模板,尝试授予所有可能的权限:

grant codeBase "file:/home/user/.jdownloader/-" {

//    permission java.security.AllPermission;

//    permission java.awt.AWTPermission "*";

    permission java.awt.AWTPermission "accessClipboard";
    permission java.awt.AWTPermission "accessEventQueue";
//    permission java.awt.AWTPermission "accessSystemTray";
    permission java.awt.AWTPermission "createRobot";
    permission java.awt.AWTPermission "fullScreenExclusive";
    permission java.awt.AWTPermission "listenToAllAWTEvents";
    permission java.awt.AWTPermission "readDisplayPixels";
    permission java.awt.AWTPermission "replaceKeyboardFocusManager";
    permission java.awt.AWTPermission "setAppletStub";
    permission java.awt.AWTPermission "setWindowAlwaysOnTop";
    permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
    permission java.awt.AWTPermission "toolkitModality";
    permission java.awt.AWTPermission "watchMousePointer";


    permission javax.sound.sampled.AudioPermission "*";
    permission javax.security.auth.AuthPermission "*";
//    permission javax.security.auth.kerberos.DelegationPermission "";
    permission javax.xml.bind.JAXBPermission "*";
    permission java.nio.file.LinkPermission "hard";
    permission java.nio.file.LinkPermission "symbolic";
    permission java.util.logging.LoggingPermission "control";
//    permission java.lang.management.ManagementPermission "*";
    permission javax.management.MBeanServerPermission "*";
    permission javax.management.MBeanTrustPermission "*";
    permission java.net.NetPermission "*";
    permission java.util.PropertyPermission "*", "read,write";
    permission java.lang.reflect.ReflectPermission "*";
    permission java.lang.RuntimePermission "*";
    permission java.security.SecurityPermission "*";
    permission java.io.SerializablePermission "*";
    permission java.sql.SQLPermission "*";
    permission javax.net.ssl.SSLPermission "*";
    permission javax.management.remote.SubjectDelegationPermission "*";
    permission javax.xml.ws.WebServicePermission "*";
//    permission  "*";

    permission java.io.FilePermission "/-", "read,write,execute,delete,readlink";
    permission javax.management.MBeanPermission "*", "*";
//    permission javax.security.auth.PrivateCredentialPermission "", "read";
    permission javax.security.auth.kerberos.ServicePermission "*", "initiate,accept";
    permission java.net.SocketPermission "*", "accept,connect,listen,resolve";
    permission java.net.URLPermission "*";
};

笔记

Java Policy Tools 是一个用于编辑策略文件的 GUI 工具。它使从下拉框中查找所有可用选项变得更加容易。它应该已经随 Java 包一起安装。

在此处输入图片描述

答案2

尽管 Sneetsher 的答案很完美,但我发现了一个更简单(且明显)的解决方案。此方法适用于 JDownloader,但也应该适用于所有其他 Java 程序。

只需删除徽标rm ~/.jdownloader/jd/img/logo/jd_logo_128_128.png,然后使用以下方法创建无效的 png 图标touch ~/.jdownloader/jd/img/logo/jd_logo_128_128.png

使用这种方法,仍然可以使用 TrayIcon 插件(用于最小化到托盘),而不需要丑陋的 Java 图标

答案3

由于我看不到明显更好的解决方案,因此这可能会有所帮助:

你可以把托盘全部扔掉!

  • 如果可能的话,禁用它
  • 或者用其他可以手动配置的面板替换整个面板,只是不添加托盘元素。(我喜欢xfce4-panel这种事情)

如果您现在怀念基于托盘的功能,那么大多数功能应该可以通过某种方式逐一替换,例如在某些事件上显示桌面通知的脚本。

答案4

如果您希望所有使用托盘图标的应用程序都能在 Ubuntu 14.04 中使用它,您可以使用 Unity 补丁附带的 PPA 重新启用系统托盘白名单。为此,请打开终端并运行以下命令:

sudo add-apt-repository ppa:gurqn/systray-trusty
sudo apt-get update
sudo apt-get upgrade

然后,按 ALT + F2 并输入“unity”或注销来重新启动 Unity。PPA 现在会自动将所有应用程序列入白名单,因此无需手动将单个应用程序列入白名单即可使用系统托盘。

恢复更改

如果您想要恢复更改并从 Ubuntu 存储库返回到默认的 Unity 软件包,请使用以下命令清除 Unity 系统托盘白名单 PPA:

sudo apt-get install ppa-purge
sudo ppa-purge ppa:gurqn/systray-trusty

http://www.webupd8.org/2013/05/how-to-get-systray-whitelist-back-in.html

相关内容