Skip to content

Releases: CommandPrompt-Wang/BetterZUIKey-GboardExt

Gboard 增强 v1.0.0

Choose a tag to compare

@CommandPrompt-Wang CommandPrompt-Wang released this 19 Sep 13:31

Gboard 增强 v1.0.0

摘要

首个公开版本。本模块通过 LSPosed 注入 Gboard 进程,拦掉它自己的语言 / 布局切换,把「切语言」这件事交还给系统输入法框架 —— 让 BetterZUIKey 的「切换到下一个输入法语言」对 Gboard 也能用;并在提交链路上补齐标点归一、引号括号配对,以及中文态 Enter 不误提交。

完整变更: 本仓库首个版本,见 https://github.com/CommandPrompt-Wang/BetterZUIKey-GboardExt/commits/main

新功能

  • 框架驱动的语言切换(严格模式)(「只响应系统框架语言切换消息」,默认关):拦掉 Gboard 自己切语言 / 切布局,语言只由框架 / BetterZUIKey 决定。四层挂点(客户端 InputMethodManager / 输入法侧 InputMethodService / IMMS 的 Binder 代理 / IInputMethodPrivilegedOperations 代理),外加拦掉「地球键 → 注入 KEYCODE_LANGUAGE_SWITCH(204) → 系统替它切」这条路。需要 BetterZUIKey v1.7.0 以上。只拦「当前输入法内部」的 subtype 切换——目标是别的输入法时一律放行(那是换输入法,不是换语言);装不上、认不出的一律放行并打日志

    • 1.6.x 亦可联动部分功能,但无法使用轮转顺序自定义功能,系统框架只能切换最近使用的 2 门语言。
  • 标点管线:把「该出什么字符(语义层)」与「宽窄(形式层)」拆开,二者可独立切换。

    功能 说明 快捷键 默认
    完整的 ……—— 输入 / 时输出两个而不是一个
    智能中文标点 更合理的中文标点映射(+ - # [ ] 等按半角处理)
    全角模式 允许在全角 / 半角之间切换 Shift+Space 开(状态默认半角
    中英文标点 允许中文态在中英标点之间切换 Ctrl+. 开(状态默认中文标点
    智能编号 数字后面的 自动用半角,方便输入 1. 2)
    • 半角 = 把 FF01–FF5E区间规则拉回 ASCII(只排除中文标点 !?;:,());全角 = 只把符号转全角、不动字母数字(否则中文态打字会变成全角拼音)
    • 之所以用区间而不是逐个补表:Gboard 原生的 .so 里躺着一张覆盖整个 ASCII 可打印区的 1:1 全角表,+= 这类就是补漏漏出来的,补表是打地鼠
  • 引号 / 括号自动补全:软键盘与物理键盘两个独立开关,共用同一份可编辑的配对表(默认 18 对,支持分组换行;留空 = 不配对)。

    • 软键盘(默认):打引号、括号时自动补另一半并把光标移进中间
    • 物理键盘(默认关,状态默认;快捷键 Ctrl+Shift+9):同上,但只认硬件按键
    • 有选区时包裹选区abc(abc))而不是替换它
    • 光标后侧已有闭字符时只把光标移过去,不再多吐一个;手动移动光标后可以恢复正常闭合
  • 中文态 Enter 不误提交(默认关):在「按回车就提交」的输入框(浏览器地址 / 搜索框、聊天消息栏)里,拼音栏还有字时按 Enter 会把原始拼音上屏、但整个输入框不再被提交。做法是把普通 Enter 整对(down + 配对的 up)改写为带 Shift 交给 Gboard 走它自己的 Shift+Enter 路径,再把这次「给拼音上屏用的」注入事件吞掉;拼音仍由 Gboard 自己提交,引擎内部状态天然同步。

  • 配置热生效:广播推送 + 有界补播链(0s / 10s / 30s / 1min / 3min / 10min / 30min),改完设置无需重启输入法,也照顾到「改设置那一刻 Gboard 往往没在跑」的场景。

  • 状态位镜像:三个状态位(全角 / 中英标点 / 物理补全)的当前档位回传到设置页显示,长按整条可应急切换

  • 界面:Material 3 首页;最上面是「自启动权限」入口与说明;快捷键反馈用贴底横幅(Gboard 进程里的 Toast 会被系统按应用通知设置拦掉,实测静默失效)。

已知限制

  • 中文态 Enter 不提交不覆盖软键盘:软键盘上的 Enter 不走 onKeyDown,本功能只对物理键盘生效。

    • 不过软键盘一般也遇不到这类问题
  • 自启动状态无法自检:联想把每个应用的自启动状态记在安全中心的私有 prefs 里,其它应用无权限读,Settings.Global/Secure 中没有对应的键(疑似这一块被魔改),所以 App 判断不出来是否已放行,只能自行前往系统设置确认。

其他

  • 仅针对 com.google.android.inputmethod.latin 的 Gboard,其他输入法无效。
  • 兼容 Gboard 17.2.2 ~ 18.3.1 / arm64:以 17.2.2 为开发基线,18.1.3 完成静态核验,最终在 18.3.1 实装 A/B 测试。理论上该范围和接近此范围的版本都可以生效,其它遥远版本可以尝试,但不保证效果。
  • 好消息是:除 DexKit 的结构化查找之外,功能挂的都是框架类 / 框架方法名,不硬编码混淆名。实测这三代 Gboard 的混淆名整批换了三套而本模块挂点一个都不用改。因此换版本时更可能是功能降级而不是完全崩溃。
  • 逆向、踩坑与实测数据整理在仓库 PRINCIPLE.md。欢迎研究学习。
  • 本仓库主要部分为 AIGC,可能有缺陷,欢迎审查和 PR。

⚠ 安装与升级注意

  • 安装后在 LSPosed 中启用模块即可 —— 作用域由模块静态声明(只有 Gboard),无需也无法手动勾选;随后杀死 Gboard 进程(或重启设备),让 hook 生效。
  • 打开模块 App 可见各开关;系统设置里给个自启动权限会让配置同步更稳。
  • 若要用严格模式(需要 BZK v1.7.0 以上):在 BZK 的「输入法增强 → 输入法适配管理」页的「使用系统框架」一段里把 Gboard 勾上(1.7.0 起 Gboard 是内置项,默认关),再打开本模块的严格模式开关。
    • 框架默认只在「最近用过的两个语言」之间轮转;要让快捷键按顺序轮满多个语言,长按那条进「轮转顺序」页,打开「覆盖默认轮转顺序」。
  • 需要 Android 8.1+ / LSPosed。
  • 本模块直接 hook 输入法的按键、提交与语言切换链路。不当配置可能导致切不到某个语言、标点 / 配对行为异常,或严格模式下无法切换语言(此时先关掉严格模式)。