[Internal testing communication] Deepin 25 应用图标显示齿轮占位符问题分析与修复
Tofloor
poster avatar
金城
deepin
5 hours ago
Author

Deepin 25 应用图标显示齿轮占位符问题分析与修复

时间:2026-06-11
环境:Deepin 25(crimson)+ dde-shell (dde-dock)
涉及应用:通义灵码 (Lingma)、Snipaste


一、症状

启动器中应用图标显示为"页面里嵌两个齿轮"的通用占位符,而非应用原始图标。同时 dde-dock 存在"点 A 图标出 B 窗口"的渲染映射错乱 bug。


二、诊断过程

步骤 1:确认 desktop 文件位置

find /usr/share/applications ~/.local/share/applications -iname '*lingma*' -iname '*snipaste*'

结果:

  • Lingma: /usr/share/applications/lingma.desktop
  • Snipaste: ~/.local/share/applications/snipaste.desktop

步骤 2:检查 desktop 文件中的 Icon 字段

grep '^Icon' /usr/share/applications/lingma.desktop ~/.local/share/applications/snipaste.desktop

结果:

lingma.desktop:  Icon=Lingma
snipaste.desktop: Icon=snipaste

步骤 3:检查图标主题目录(hicolor)

find /usr/share/icons/hicolor -iname '*lingma*'
find /usr/share/icons/hicolor -iname '*snipaste*'

结果:均不存在。

步骤 4:检查 pixmaps 回退路径及系统级图标

find /usr/share/pixmaps -iname '*lingma*'      # → /usr/share/pixmaps/Lingma.png
find /usr/share/pixmaps -iname '*snipaste*'    # → 无
  • Lingma: 图标存在于 pixmaps(1024×1024 PNG)
  • Snipaste: AppImage 格式,图标封在镜像内,系统目录无任何图标文件

步骤 5(验证实验):测试 pixmaps 回退是否生效

操作:移除 Lingma 在 hicolor 中的图标 → 重启 dde-shell → 观察启动器。

mv ~/.local/share/icons/hicolor/256x256/apps/Lingma.png \
   ~/.local/share/icons/hicolor/256x256/apps/Lingma.png.bak
systemctl restart --user dde-shell@DDE.service

结果(实测):Lingma 图标依然正常显示,未变回齿轮。说明 dde-dock 从 pixmaps 路径成功加载了图标。

结论:Deepin 25 的 dde-dock 确实支持 freedesktop 规范的 pixmaps 回退。Lingma 的齿轮根因不是图标查找问题。


三、根因分析(修正)

根因 1:Lingma — dde-shell 渲染层映射错乱 (推断)

⚠️ 此为推理结论,未通过日志或源码直接证实,证据链如下。

已确认的事实

  • 图标文件完好(/usr/share/pixmaps/Lingma.png,1024×1024 PNG)
  • dde-dock 支持 pixmaps 回退(实测验证:移除 hicolor 图标后重启,图标正常)
  • 重启 dde-shell 后齿轮消失、图标恢复,无需修改任何文件

推理
齿轮占位符与"点 A 图标出 B 窗口"高度可能是同一个 dde-shell 渲染层 bug 的不同表现——DBus 层面数据正确,屏幕渲染层偶发映射错乱。排除图标缺失、pixmaps 回退失败等可能后,渲染层 bug 是唯一合理解释。

待验证:抓取 dde-shell 日志或源码确认渲染层具体出错点,可最终定论。

根因 2:Snipaste — 图标缺失 + 大小写不匹配

Snipaste 是唯一真正存在图标配置问题的应用,根因有两层:

问题 A — AppImage 无系统图标:AppImage 是自包含镜像格式,不会有安装过程,图标只在镜像内部,系统 /usr/share/pixmaps/hicolor 中没有任何 Snipaste 图标文件。dde-dock 即使支持 pixmaps 回退也找不到。

问题 B — 大小写不一致

  • desktop 文件:Icon=snipaste(全小写)
  • AppImage 内实际图标:Snipaste.png(首字母大写)
  • Linux 文件系统区分大小写,snipaste ≠ Snipaste

即使手动从 AppImage 提取图标放到 hicolor,只要 desktop 的 Icon= 与文件名大小写对不上,依然找不到。


四、修复方法

Lingma(dde-shell 渲染 bug)

无需修复文件。只需重启 dde-shell 即可恢复:

systemctl restart --user dde-shell@DDE.service

桌面闪 1-2 秒,窗口不丢。

注:之前做的"复制图标到 hicolor"对 Lingma 是不必要的,图标本来就能从 pixmaps 找到。但做了也无害。

Snipaste(真正的图标缺失)

# 1. 从 AppImage 提取图标
cd /tmp
/home/XingFangYuan/Applications/Snipaste-2.11.3-x86_64.AppImage --appimage-extract

# 2. 复制所有尺寸到用户级 hicolor(无需 sudo)
for size in 16 32 48 256; do
  mkdir -p ~/.local/share/icons/hicolor/${size}x${size}/apps
  cp squashfs-root/usr/share/icons/hicolor/${size}x${size}/apps/Snipaste.png \
     ~/.local/share/icons/hicolor/${size}x${size}/apps/Snipaste.png
done

# 3. 修复 desktop 文件的大小写(核心)
sed -i 's/^Icon=snipaste$/Icon=Snipaste/' ~/.local/share/applications/snipaste.desktop

# 4. 生效
systemctl restart --user dde-shell@DDE.service

五、通用诊断脚本

当任意应用出现齿轮占位符时,按以下优先级排查:

#!/bin/bash
# 用法: ./debug-icon.sh 应用名
APP="$1"
DESKTOP=$(find /usr/share/applications ~/.local/share/applications -iname "*${APP}*.desktop" 2>/dev/null | head -1)

echo "=== 第一步:先试重启 dde-shell(排除渲染 bug) ==="
echo "systemctl restart --user dde-shell@DDE.service"
echo "如果重启后图标恢复 → dde-shell 渲染 bug,无需继续排查"
echo ""

echo "=== 第二步:Desktop 文件 ==="
echo "$DESKTOP"
ICON=$(grep -i '^Icon=' "$DESKTOP" | head -1 | cut -d= -f2)
echo "Icon 字段: $ICON"

echo ""
echo "=== 第三步:hicolor 主题中是否存在 ==="
find /usr/share/icons/hicolor ~/.local/share/icons/hicolor -iname "${ICON}.*" 2>/dev/null
echo "(注意:文件名与 Icon= 字段必须严格大小写一致)"

echo ""
echo "=== 第四步:pixmaps 中是否存在 ==="
find /usr/share/pixmaps -iname "${ICON}.*" 2>/dev/null

echo ""
echo "=== 判断 ==="
echo "pixmaps 里有 → dde-shell 渲染 bug,重启即可"
echo "pixmaps 没有、hicolor 也没有 → AppImage/容器类应用,需手动提取图标"
echo "hicolor 里有但还齿轮 → 检查 Icon= 大小写是否与文件名严格匹配"

六、结论

问题 根因 证据等级 责任方
Lingma 齿轮 dde-shell 渲染层映射错乱 推断(排除法 + 行为特征匹配) Deepin
Lingma + "点A出B窗口" 同上,同一 bug 的不同表现 同上 Deepin
Snipaste 齿轮 AppImage 无系统图标 + desktop 大小写不一致 已证实(文件检查 + 修复验证) 应用打包/格式
Deepin 25 pixmaps 回退 正常支持 已证实(实测移除 hicolor 图标后从 pixmaps 加载成功)

七、建议

给 Deepin 社区:dde-shell 渲染层映射错乱(图标占位符 / 点A出B窗口)是确认存在的 bug,建议纳入 issue tracker。重启 dde-shell 可临时恢复。

给应用打包者

  • 安装时执行 xdg-icon-resource install 将图标注册到 hicolor,或 desktop 文件使用绝对路径 Icon=/usr/share/pixmaps/xxx.png
  • 务必确保 desktop 的 Icon= 值与图标文件名大小写严格一致

给用户:遇到齿轮占位符,第一步先重启 dde-shell —— 大概率是渲染 bug,不是图标真丢了。重启无效再按诊断脚本排查实际图标缺失问题。

Reply Favorite View the author
All Replies

No replies yet