跳转至

讯飞输入法状态栏"重启后复弹"

本文记录一次用 AI(Claude Code)排查 Windows 桌面软件黑盒问题的完整过程。问题本身不大,但排查路径有代表性:AI 负责定位文件、对比数据、设计实验和修正假设,人负责执行需要真实环境的操作(重启、断网、界面点击),数据回流后逐轮收敛,最终定位到机制并给出一条命令的解决方案。

一、环境与现象

项目 内容
操作系统 Windows 10 Pro 19045
软件 讯飞输入法 3.0.1738(C:\Program Files (x86)\iFlytek\iFlyIME\3.0.1738)
账号状态 未登录(匿名设备身份)
现象 右键状态栏 →「隐藏状态栏」当时生效;每次重启电脑后状态栏重新弹出

搜索引擎能找到的资料只有"右键隐藏"的官方操作说明,对复弹问题无解。

二、配置存储定位

AI 逐一排查了安装目录、注册表、ProgramData 和用户目录,定位过程如下:

检查位置 结果
安装目录 ...\3.0.1738\cfg\*.ini 均为日志配置,与设置无关
C:\ProgramData\iFly Info Tek\iFlyIME\iflyImeCfg.xml 仅版本号与安装路径(GB2312 编码)
用户目录 AppData\LocalLow\iFly Info Tek\iFlyIME\iflyImeCfg.xml 同上
注册表 HKCU\Software\iFly Info Tek\iFlyIME 仅 3 条自定义快捷键
注册表 HKLM\SOFTWARE(\\WOW6432Node)\iFly Info Tek\iFlyIME 仅安装路径
AppData\LocalLow\iFly Info Tek\iFlyIME\config.kv 用户设置主存储,二进制 protobuf 风格 KV,页大小 4096 字节,配套 config.crc 校验
同目录 account\profile.bin 账号数据,已加密

config.kv 初始含 16 个键(canUpgradeToKV、uid、sid、userid、imei、mac、update_checked_version、update_next_time、Inputlog_open_tag、Inputlog_open_expired、Advance_update_set、join_user_plan、Pen_Lift_Time、Pen_Width、Writing_Mode、FullScreen),覆盖手写、更新、遥测等设置。

另有两个重要性质,后续推理都会用到:

  1. 延迟落盘:修改设置后 1~7 分钟才写入文件,需要后台监视捕捉;
  2. 键名混淆:所有二进制中均搜不到 Show_status_windows 字符串,静态分析走不通,只能走动态对比。

三、实验与数据

实验 1:锁定状态栏开关(隐藏前后对比)

操作:快照 config.kv → 右键隐藏状态栏 → 后台轮询等待落盘 → 对比。

数据:约 7 分钟后落盘。内容区唯一变化为新增一个键:

0a 13 "Show_status_windows" 12 01 30
                      └─ 值 = "0"(隐藏)

结论:Show_status_windows 即状态栏开关,"0"= 隐藏;显示为默认态,键不存在。

实验 2:只读锁定(失败假设)

操作:将 config.kv、config.crc 设为只读,重启。

数据:状态栏仍弹出;磁盘文件逐字节未变(键仍为 "0")。

推断:只读使 KV 库(通常按读写方式打开文件)加载失败,程序回退默认配置。只读既锁不住设置,反而破坏加载,是负优化。

此轮的关键输入是一条人工观察:"之前没设只读时,重启也一样弹"——说明覆盖与只读无关,排查方向转向"开机时有流程主动重写配置"。

实验 3:可写 + 联网重启(抓到重建)

操作:解锁只读,对全部 23 个非崩溃、非词库文件做 MD5 快照并导出注册表,联网重启,开机后立即对比。

数据:

  • 23 个文件中仅 config.kv、config.crc 变化(开机瞬间 19:16 重写);
  • config.kv 键数 13 → 8,Show_status_windows 被整体删除(而非改回 "1"),同时消失的还有 Advance_update_set、Pen_Lift_Time、Writing_Mode、join_user_plan;
  • MD5:e6133567... → 6f75785f...。

结论:config.kv 不是配置的最终来源,而是缓存/导出物;每次开机由某个上游配置源重建,"隐藏"在重建中被覆盖。

实验 4:可写 + 断网重启(定位元凶)

操作:断网 → 隐藏状态栏 → 确认落盘(Show_status_windows="0",19:39 写入)→ 保持断网重启。

数据:隐藏状态保留,状态栏不再弹出。

结论:重建动作依赖网络,即开机时以匿名设备身份(imei + 匿名 uid,无账号 userid)联网拉取云端默认配置,覆盖本地。未登录用户拉到的永远是默认配置,因此本地隐藏每次都被打回。

实验 5:可写 + 联网 + 防火墙屏蔽(收敛到进程)

推理:配置重建由 UI 宿主进程 iFlyPlatform.exe 完成;语音(iFlyVoice.exe)、手写(iFlyHandwriting.exe)均为独立进程,按程序路径屏蔽可在掐断配置同步的同时不影响其他功能。

操作:添加防火墙出站规则,联网重启。

数据:隐藏状态保留,复弹消失。方案成立。

四、机制总结

开机条件 状态栏 原因
文件可写 + 断网 保持隐藏 ✅ 本地配置正常加载
文件只读 复弹 ❌ KV 打开失败,配置库加载不出,回退默认
文件可写 + 联网 复弹 ❌ 拉取云端默认配置重建 KV,本地"隐藏"被删除
可写 + 联网 + 屏蔽 iFlyPlatform.exe 保持隐藏 ✅ 云端拉取被阻断

五、解决方案(已实测)

管理员 cmd 执行。添加规则(单行):

netsh advfirewall firewall add rule name="Block iFlyPlatform config sync" dir=out action=block program="C:\Program Files (x86)\iFlytek\iFlyIME\3.0.1738\iFlyPlatform.exe" enable=yes

查看规则:

netsh advfirewall firewall show rule name="Block iFlyPlatform config sync"

删除规则(撤销):

netsh advfirewall firewall delete rule name="Block iFlyPlatform config sync"

六、注意事项

  1. 不要把 config.kv / config.crc 设为只读——导致配置库加载失败,全部设置回退默认,并冻结后续写入。
  2. 防火墙规则按程序路径生效,输入法升级更换版本目录(如 3.0.1739)后规则失效,复弹时需按新路径重建。
  3. iFlyPlatform.exe 被完全断网,如发现候选、皮肤、活动推送等功能异常,删除规则即可恢复;语音输入为独立进程,理论上不受影响,建议实测一次。

七、方法论:这次 AI 用法的可复用点

  1. AI 的输出当假设,实验说了算。 "只读导致加载失败"是被证伪的假设;证伪后剩余解释空间迅速收敛。每一步结论都有快照对比兜底(文件哈希、键表 diff、字节级数据),没有一步是"AI 说是什么就是什么"。
  2. 人工观察是关键变量。 "之前不设只读也弹"这条历史事实 AI 无法自行获得,由人提供后直接扭转排查方向。AI 摸不到的现场(重启、断网、点击),由人执行并把结果原样喂回。
  3. 静态分析走不通时换动态对比。 键名在二进制中被混淆,搜不到;但配置值落盘是明文,前后快照一对比就现形。"改不了分析对象,就改观测方式"。
  4. 给 AI 工具和环境是前提。 会话内可直接读文件、跑命令、挂后台轮询,这让"设计实验 → 拿数据 → 修假设"的循环能在一小时内跑完五轮。
  5. 产出超出问题本身。 除了解决复弹,还得到:该软件完整的配置存储地图、延迟落盘与云端重建机制的认知、三条可复制的命令,以及一份可交接的文档。