一、需求目标

安卓设备使用 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

基本逻辑是:

  1. rime.lua 负责加载 Lua 模块;
  2. date_time.lua 判断输入编码;
  3. 使用系统时间生成动态候选;
  4. .custom.yaml 将 Lua translator 插入当前方案;
  5. 设置较高候选质量,使动态结果出现在前排;
  6. 重新部署 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 目录和方案产物:明显更旧

这说明新增配置写入后,部署产物没有同步更新。

这一现象通常对应几种可能:

  1. 没有真正点击重新部署;
  2. 重新部署没有作用到 Rime;
  3. Fcitx 实例没有重新加载;
  4. 配置合并失败;
  5. 活动方案不是预期方案;
  6. 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 支持
→ 捕获部署日志
→ 重新部署
→ 真实候选验收

比单纯复制桌面端配置更稳妥。

Leave a Reply

Your email address will not be published. Required fields are marked *