Skip to content

feat(Windows app-search): 修复应用索引不完整与图标显示问题,补齐开始菜单同源数据并实现图标缓存自愈#491

Open
XiaoSong-dada wants to merge 2 commits into
rubickCenter:masterfrom
XiaoSong-dada:应用搜索覆盖

Hidden character warning

The head ref may contain hidden characters: "\u5e94\u7528\u641c\u7d22\u8986\u76d6"
Open

feat(Windows app-search): 修复应用索引不完整与图标显示问题,补齐开始菜单同源数据并实现图标缓存自愈#491
XiaoSong-dada wants to merge 2 commits into
rubickCenter:masterfrom
XiaoSong-dada:应用搜索覆盖

Conversation

@XiaoSong-dada
Copy link
Copy Markdown

背景与目标

Rubick 在 Windows 11 上的应用搜索存在两个主要问题:

  1. 搜索覆盖率不足:开始菜单能搜到的应用(如 Clash Verge)Rubick 搜不到,部分应用(如 QQ)偶尔出现,表现不稳定。
  2. 图标显示缺失:能搜到的应用图标常显示为灰色占位,尤其当应用来自 Get-StartApps(AppID 分支)时;清空 %TEMP%\ProcessIcon 后图标无法自动恢复。

目标:让 Rubick 的 Windows 应用搜索尽可能与系统开始菜单一致,并确保图标稳定显示。

问题根因

  • 索引竞态:原有开始菜单目录扫描为异步递归,但函数返回未等待扫描完成,导致 appList 经常不完整。
  • 数据源不足:仅依赖 .lnk 快捷方式,遗漏 UWP 应用及部分注册型入口(如 AppID 标识的应用)。
  • 图标写入与读取不一致
    • 图标路径使用 encodeURIComponent(appName) 生成,而实际写入使用未编码的 app.name,导致文件找不到。
    • 图标写入是异步的,列表渲染时文件可能尚未生成,出现灰色。
  • Get-StartApps 项无图标来源extract-file-iconshell:AppsFolder\AppID 输入返回空 buffer,无法直接提取图标。
  • 文件名编码问题:URL 编码后的文件名包含 %20 等字符,且不同语言环境下可能产生乱码,导致图标文件无法被正确引用。

解决方案

本次 PR 通过组合策略与自愈机制,系统性地修复上述问题:

  1. 完善应用索引(win.ts)

    • 合并三大数据源:系统开始菜单、用户开始菜单、PowerShell Get-StartApps
    • 修复异步扫描:将递归遍历改为 Promise 并 await,确保索引完整后返回。
    • Get-StartApps 结果映射为 AppInfo,并添加 AppID 分词作为关键词,提升搜索命中率。
  2. 统一图标缓存路径与写入方式

    • 新增 getIconPathByName(name),使用 normalizeAppName 清洗文件名(去除非法字符、保留中文和空格),替代 URL 编码。
    • 图标写入改为同步(writeFileSync),确保函数返回时文件已存在,消除竞态。
  3. 为 Get-StartApps 项提供图标兜底

    • 在扫描开始菜单时建立 appName.lnk 路径的映射。
    • 生成 StartApps 候选时,若存在同名 .lnk,优先用该 .lnk 提取图标并写入缓存,同时记录 iconSource 供后续重建。
  4. 实现展示阶段的“缺图重试”机制

    • 渲染进程生成候选时检测本地图标文件是否存在。
    • 若缺失,通过 IPC 调用主进程 rebuildAppIcon(使用 iconSourcedesc 提取图标)。
    • 仍失败则降级使用 app.getFileIcon 获取 dataURL 临时展示,并记录失败缓存避免无限重试。
  5. 优化 PowerShell 输出编码

    • 在调用 Get-StartApps 前设置 [Console]::OutputEncoding=[System.Text.Encoding]::UTF8,降低中文乱码概率。

关键修改点

  • src/core/app-search/win.ts:重写扫描逻辑,合并数据源,统一图标路径,添加文件名清洗。
  • src/main/common/api.ts:新增 rebuildAppIcon IPC 方法,支持图标重建。
  • src/renderer/plugins-manager/options.ts:添加图标缺失检测与自愈逻辑。
  • src/renderer/components/search.vue:微调,确保图标路径传递正确。

验证方式

  1. 清空 %TEMP%\ProcessIcon 目录。
  2. 重启 Rubick,依次搜索:
    • clash → 应出现 Clash Verge,图标正常显示(可能通过 .lnk 或兜底重建)。
    • qq微信 → 图标应正常,缓存文件名应为可读格式(如 QQ.png微信.png),无乱码。
    • 其他常用应用,确保覆盖率与开始菜单一致。
  3. 再次清空缓存并重启,观察图标是否自动重建。

此 PR 使 Rubick 在 Windows 11 上的应用搜索体验大幅提升,索引完整性与图标显示稳定性达到可交付状态。

@XiaoSong-dada
Copy link
Copy Markdown
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant