[Feedback on issues] 关机界面 QQ 图标显示为齿轮占位图(Electron 应用识别失败)
Tofloor
poster avatar
姚建宇
deepin
2026-09-09 08:03
Author

【Bug 反馈】关机"以上程序阻止关机"界面中 QQ 图标显示为通用齿轮占位图

基本信息

  • 系统版本: Deepin 25 (crimson)
  • 相关组件: dde-session-shell 6.0.65、dde-application-manager 1.2.59、dde-daemon 6.1.101
  • 应用: QQ for Linux 3.2.32-51802 (linux.qq.com,原生 Linux 版,Electron 内核)
  • 问题类型: 显示缺陷(图标解析失败)

问题描述

点击关机/重启时,若 QQ 正在运行,"以上程序阻止关机"界面中 QQ 条目不显示 QQ 图标,而是显示通用占位图标(application-x-desktop,即"带齿轮的页面")。其他应用(如百度网盘、腾讯会议)在更新后可正常显示图标,QQ 一直异常。

复现步骤

  1. 登录桌面,启动 QQ(登录后保持运行即可,无需打开聊天窗口)
  2. 点击"关机"或"重启"
  3. 弹出"以上程序阻止关机"界面,观察 QQ 条目图标
  4. 实际结果:QQ 显示为齿轮占位图;预期结果:显示 QQ 企鹅图标

根因分析(已通过源码+运行时验证)

QQ 会向 logind 注册 inhibitor(who="qq"),因此出现在阻止关机列表中。关机界面图标解析流程(dde-session-shell src/widgets/inhibitwarnview.cpp InhibitorRow 图标解析):

  1. 通过 Dtk::Core::DSGApplication::getId(pid) 调用应用管理器 org.desktopspec.ApplicationManager1.Identify(pidfd) 识别进程对应的应用 ID;
  2. 再用应用 ID 查询 org.desktopspec.ApplicationManager1.Application.Icons 属性中的 "Desktop Entry" 图标名;
  3. 最后 QIcon::fromTheme(iconName) 从图标主题加载图标。

关键失败点:对 QQ 进程调用 Identify(pidfd) 时报错:

org.freedesktop.DBus.Error.Failed: can't find application: org.chromium.Chromium

原因:QQ 是 Electron(Chromium) 应用,启动后自报的应用 ID 为 org.chromium.Chromium(其 systemd scope 名为 app-org.chromium.Chromium-.scope),但系统应用管理器中没有注册 ID 为 org.chromium.Chromium 的应用条目(无对应 desktop 文件)。因此:

  • Identify 失败 → appId 为空 → 图标名称为空 → QIcon::fromTheme("") 返回空 → 回退到 application-x-desktop(齿轮图)。

百度网盘、腾讯会议等应用能正常显示,是因为它们的进程可被正常识别(应用 ID 已注册)。

用户侧临时解决方案(已验证有效)

在 ~/.local/share/applications/ 下创建 org.chromium.Chromium.desktop(NoDisplay=true,Icon=qq),并在图标主题中提供 qq 图标,使应用管理器能识别 QQ 进程并返回正确图标名。但该方案为单用户级 hack,需要官方修复。

建议官方修复方案

  1. (推荐)dde-application-manager / dde-session-shell 侧兜底:当 Identify 失败或返回空 appId 时,回退使用 /proc//exe 的可执行文件名作为图标名(当前代码存在缺陷,见下)或按可执行文件路径匹配 desktop 文件;
  2. 系统预置条目:在系统级注册 org.chromium.Chromium 应用条目(或在识别逻辑中将 Chromium/Electron 自报 ID 映射到实际 desktop 文件);
  3. 腾讯侧:在 QQ 启动参数/环境变量中显式设置正确的应用 ID(如 --app-id / DSG_APP_ID),避免 Electron 默认使用 org.chromium.Chromium。

附:排查中发现的 dde-session-shell 源码缺陷(供开发者参考)

inhibitwarnview.cpp 图标解析存在两个已知缺陷,影响所有"进程名回退"场景:

  1. 进程名回退路径写死为 QString("/proc//exe")(缺少 %1 占位符),.arg(pid) 无法注入 PID,导致回退永远失败;
  2. 回退分支中 QString iconName = executable_info.fileName(); 为局部变量,遮蔽了外层 iconName,赋值无法传出。
    建议一并修复(改为 QString("/proc/%1/exe").arg(pid) 并去除遮蔽)。

验证信息

  • logind inhibitor: "shutdown" "qq" "Ensure a clean shutdown" "delay" 1000
  • 应用管理器 Identify 报错信息:can't find application:org.chromium.Chromium
  • 修复前 Icons 属性: {"Desktop Entry": "/opt/apps/linux.qq.com/entries/icons/hicolor/512x512/apps/qq.png"}(绝对路径,且因 Identify 失败根本取不到)

用户侧已通过注册应用条目临时解决,但仍建议官方修复

Reply Favorite View the author
All Replies
avatar
𰻞𰻝面
deepin
2026-09-09 09:33
#1

这都能查出来

Reply View the author
avatar
BLumia
deepin
2026-09-09 09:56
#2

原因:QQ 是 Electron(Chromium) 应用,启动后自报的应用 ID 为 org.chromium.Chromium(其 systemd scope 名为 app-org.chromium.Chromium-.scope),但系统应用管理器中没有注册 ID 为 org.chromium.Chromium 的应用条目(无对应 desktop 文件)。

你的 QQ 是什么版本(比如是官方提供的 AppImage 版?)以及是从哪里启动的(文件管理器双击?)?

dde-application-manager 在尝试运行程序时会根据 desktop id 将其放在恰当的 cgroup 里,按你上面的描述的话看上去压根不存在对应的 .desktop 文件,不像是商店版或者 deb 版。所以想确认下实际情况。

另外“排查中发现的缺陷”里的 1 大概是 AI 幻觉?现有代码未发现有写成 /proc//exe 的。2应该是确实存在的问题。

Reply View the author
avatar
姚建宇
deepin
2026-09-09 15:37
#3
BLumia:

原因:QQ 是 Electron(Chromium) 应用,启动后自报的应用 ID 为 org.chromium.Chromium(其 systemd scope 名为 app-org.chromium.Chromium-.scope),但系统应用管理器中没有注册 ID 为 org.chromium.Chromium 的应用条目(无对应 desktop 文件)。

你的 QQ 是什么版本(比如是官方提供的 AppImage 版?)以及是从哪里启动的(文件管理器双击?)?

dde-application-manager 在尝试运行程序时会根据 desktop id 将其放在恰当的 cgroup 里,按你上面的描述的话看上去压根不存在对应的 .desktop 文件,不像是商店版或者 deb 版。所以想确认下实际情况。

另外“排查中发现的缺陷”里的 1 大概是 AI 幻觉?现有代码未发现有写成 /proc//exe 的。2应该是确实存在的问题。

我的QQ就是从应用商店下载安装的deb版,启动方式跟其他应用一样,就两个途径:启动器(开始菜单)启动和桌面双击启动。

Reply View the author
avatar
lyhdzxf
deepin
2026-09-09 16:50
#4

agree 高手,膜拜like

Reply View the author