讯飞输入法状态栏"重启后复弹"¶
本文记录一次用 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~7 分钟才写入文件,需要后台监视捕捉;
- 键名混淆:所有二进制中均搜不到
Show_status_windows字符串,静态分析走不通,只能走动态对比。
三、实验与数据¶
实验 1:锁定状态栏开关(隐藏前后对比)¶
操作:快照 config.kv → 右键隐藏状态栏 → 后台轮询等待落盘 → 对比。
数据:约 7 分钟后落盘。内容区唯一变化为新增一个键:
结论: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
查看规则:
删除规则(撤销):
六、注意事项¶
- 不要把
config.kv/config.crc设为只读——导致配置库加载失败,全部设置回退默认,并冻结后续写入。 - 防火墙规则按程序路径生效,输入法升级更换版本目录(如 3.0.1739)后规则失效,复弹时需按新路径重建。
iFlyPlatform.exe被完全断网,如发现候选、皮肤、活动推送等功能异常,删除规则即可恢复;语音输入为独立进程,理论上不受影响,建议实测一次。
七、方法论:这次 AI 用法的可复用点¶
- AI 的输出当假设,实验说了算。 "只读导致加载失败"是被证伪的假设;证伪后剩余解释空间迅速收敛。每一步结论都有快照对比兜底(文件哈希、键表 diff、字节级数据),没有一步是"AI 说是什么就是什么"。
- 人工观察是关键变量。 "之前不设只读也弹"这条历史事实 AI 无法自行获得,由人提供后直接扭转排查方向。AI 摸不到的现场(重启、断网、点击),由人执行并把结果原样喂回。
- 静态分析走不通时换动态对比。 键名在二进制中被混淆,搜不到;但配置值落盘是明文,前后快照一对比就现形。"改不了分析对象,就改观测方式"。
- 给 AI 工具和环境是前提。 会话内可直接读文件、跑命令、挂后台轮询,这让"设计实验 → 拿数据 → 修假设"的循环能在一小时内跑完五轮。
- 产出超出问题本身。 除了解决复弹,还得到:该软件完整的配置存储地图、延迟落盘与云端重建机制的认知、三条可复制的命令,以及一份可交接的文档。