一、需求目标
安卓设备使用 Fcitx5 for Android,并安装了 Rime 插件。希望在现有拼音方案中加入动态日期和时间候选。
目标触发词包括:
riqi → 当前日期
shijian → 当前时间
xianzai → 当前日期和时间
xingqi → 当前星期
要求保持原有输入习惯,不更换输入法框架,不影响用户词库和同步数据。
桌面版 Fcitx5-Rime 中,可以通过 Lua translator 实现类似功能。但安卓版本的目录结构、插件构建和部署方式与桌面 Linux 不完全相同,不能直接照搬。
二、最初的实现思路
最初方案采用三个核心文件:
rime.lua
lua/date_time.lua
<当前方案>.custom.yaml
目录结构类似:
data/rime/
├── rime.lua
├── <当前方案>.custom.yaml
└── lua/
└── date_time.lua
基本逻辑是:
rime.lua负责加载 Lua 模块;date_time.lua判断输入编码;- 使用系统时间生成动态候选;
.custom.yaml将 Lua translator 插入当前方案;- 设置较高候选质量,使动态结果出现在前排;
- 重新部署 Rime。
理论上,这一结构是合理的。
三、为什么第一次没有生效
配置文件写入后,实际输入没有出现动态候选。
最初并不能确定问题位于哪一层:
- 安卓 Rime 插件是否支持 Lua
- Lua 模块是否被加载
- 当前活动方案是否判断正确
.custom.yaml文件名是否匹配- YAML patch 是否合并
- translator 名称是否一致
build是否重新生成- 应用是否真正执行了重新部署
- 候选是否生成但排序过低
静态查看文件只能证明“配置存在”,不能证明运行时已经加载。
四、通过无线 ADB 获取运行时证据
无线 ADB 建立后,可以直接查看 Fcitx5 Android 的外部数据目录。
审计重点包括:
data/rime/
data/rime/build/
data/rime/lua/
user.yaml
installation.yaml
*.custom.yaml
*.schema.yaml
还可以检查:
- Fcitx5 主应用版本
- Rime 插件版本
- Anthy 等其他插件
- 当前默认输入法
- 当前活动 schema
- APK 中是否包含 Lua 支持
- 部署日志
- Rime 运行时日志
这使排查从“根据备份猜测”变成“根据实时系统判断”。
五、关键时间线线索
实时目录中发现:
Lua 配置文件更新时间:较新
custom 配置更新时间:较新
build 目录和方案产物:明显更旧
这说明新增配置写入后,部署产物没有同步更新。
这一现象通常对应几种可能:
- 没有真正点击重新部署;
- 重新部署没有作用到 Rime;
- Fcitx 实例没有重新加载;
- 配置合并失败;
- 活动方案不是预期方案;
- Lua 插件加载失败。
其中,“配置文件存在,但 build 仍旧”是非常重要的诊断信号。
六、确认安卓 Rime 插件的 Lua 能力
桌面端支持 Lua,并不代表安卓插件一定支持。
因此需要拉取 Rime 插件 APK,在服务器上进行静态检查:
- native library
- ELF 字符串
- Lua runtime
lua_translator- librime 模块
- 插件初始化信息
判断不能只依赖文件名。
例如没有独立的:
librime-lua.so
并不能证明不支持 Lua,因为模块可能被静态链接。
同样,APK中出现字符串 lua,也不能单独证明 Lua translator 已经可用。
最终需要结合:
APK 内容
运行日志
部署结果
实际候选行为
进行判断。
本次检查确认,当前安卓 Rime 插件确实具备 Lua能力。
七、配置本身并没有根本错误
进一步检查发现:
- 当前活动方案与 custom 文件基本匹配;
- Lua 模块结构可用;
- translator 注册方式合理;
- 动态候选代码能够读取系统日期和时间;
- 候选质量设置没有明显问题;
- 用户词库和同步数据没有被破坏。
因此,问题并不是“安卓一定不支持 Lua”,也不是“Lua 文件完全写错”。
更可能的直接原因是:
新增配置尚未被当前 Rime 实例重新部署或重新加载
八、为什么后来突然生效
在后续审计过程中,Fcitx5 主界面被重新打开,输入法实例也重新进入活跃状态。
虽然日志没有完整记录到每一步部署过程,但手机端随后进行真实输入测试时,四个触发词全部能够显示正确候选。
这说明某个重新加载过程最终发生了:
- Fcitx5 检测到配置变化;
- Rime 重新读取用户配置;
- schema build 被更新或重新载入;
- Lua translator 进入运行时。
因此,最终状态不是“静态配置看起来正确”,而是:
配置已被实际加载
动态候选已在手机候选栏中出现
九、真实验收比配置检查更重要
输入法功能不能只靠文件判断。
完整验收至少包括:
riqi
shijian
xianzai
xingqi
每项需要确认:
- 候选栏真实出现结果;
- 日期与手机系统日期一致;
- 时间与当前时区一致;
- 星期正确;
- 候选位于可见页面;
- 普通拼音输入仍正常;
- 用户词库没有异常损坏;
- 其他输入法插件没有受影响。
只有真实候选通过,才能判定完成。
十、动态候选是否进入用户词库
Lua translator 生成的候选不是静态词典条目。
它通常在输入时动态产生,并不会因为文件存在就自动写入用户词库。
但需要注意,用户如果选择并提交候选,Rime 的学习机制可能仍会记录部分输入行为。
因此,更准确的结论是:
动态内容本身由 Lua 实时生成;
不会作为固定日期时间词条预先写入用户词库;
实际选择候选时是否产生学习记录,取决于当前 Rime 行为。
不能仅凭理论断言用户词库文件一定完全不变化。
十一、桌面端经验能参考什么
桌面 Linux 环境的成功经验仍然有价值,主要包括:
- 模块化
rime.lua - 独立 Lua 文件
- translator 注册
- 候选质量调整
- 检查当前输入法是否真的是 Rime
- 检查 build 产物
- 真实候选验收
但以下桌面命令不能直接用于 Android:
systemctl --user
fcitx5-remote
rime_deployer
桌面 Linux 用户目录路径
桌面 DBus 控制
Android 应使用:
- Fcitx5 Android 设置界面
- Rime 插件重新部署
- 重启 Fcitx 实例
- ADB logcat
- ADB 截图
- Android 实际候选测试
十二、最终结论
本次问题的核心经验是:
配置文件写入成功,不代表输入法已经重新部署;Lua代码结构合理,也不代表运行时已经加载。
最终确认:
- 安卓 Rime 插件支持 Lua;
- 动态日期时间配置可用;
- 活动方案匹配;
- 用户词库和同步数据保持正常;
- 首次失败主要与重新部署或重新加载未完成有关;
- 在配置真正进入运行时后,四个动态触发词全部可用。
这类问题最可靠的排查顺序应当是:
确认当前输入引擎
→ 确认活动 schema
→ 检查用户配置
→ 检查 build
→ 确认 Lua 支持
→ 捕获部署日志
→ 重新部署
→ 真实候选验收
比单纯复制桌面端配置更稳妥。