Skip to content

Repository files navigation

搜狗输入法联想版增强

BetterZUIKey-SogouOEMExt

简体中文

Android Xposed Java License

联想 OEM 版搜狗输入法(29496052 / 1.0.android_pad_lenovo_2024.20260130165252)的增强模块

君ノ声ガ 聞コエルヨ。

你的声音,我能听到呀。

声明:本仓库主要部分均为 AIGC,可能有缺陷,欢迎审查和 PR。

应用图标基于搜狗输入法自带图标二次创作;流萤像素画来源未知,如有侵权请联系删除


Le judgement du pécheur / 罪行宣判

其一:闭门塞户

联想平板预装的搜狗输入法联想 OEM 版里明明有拼音 / 英语 / 五笔三种语言,但它只声明了一个 subtype,因此框架完全不知道它们。于是,系统与 BetterZUIKey 中那套「切换到下一个输入法语言」不会起任何作用。能且只能通过 Shift 切换输入法语言。

其二:粗枝大叶

在汉字输入模式下,输入法只维护了一些的中-英标点映射,但对于列表外的标点,粗暴地全部使用全角输出,包括 {}[]等,导致部分要求半角输入的区域必须切换到英文模式。

这个问题已经经过反馈,但没有实质性进展。

另外,很多功能看起来像是半成品:

  1. 中文输入时会提供单词建议,却不允许大写字母进入拼音栏触发建议 ¹
  2. 软键盘允许括号自动完成,物理键盘却没有此功能
  3. PC 端全半角、智能编号等功能均未提供

¹ 当输入“Dance”时,“D” 直接上屏而 “ance”进入拼音栏


唯一的缺点就是没有广告了

本模块通过注入搜狗 IME 进程,用搜狗自己的身份补入 subtype,并接管其语言切换链路;修正英文输入、补全自动完成功能;增加全半角切换……以此将其优化成一个相对可用的输入法。

版本:1.2.2versionCode 5

功能特性

  • 自定义语言切换:勾选要把哪些语言暴露给框架(做成 subtype),切换序列交给 BetterZUIKey
  • 严格模式:屏蔽搜狗原生切换键,语言切换完全由框架管理
  • 标点管线:分离中英标点和全角半角状态位,允许独立切换
  • 中文态大写字母:中文态下 Shift+字母也整词进拼音栏,上屏时按记录还原大小写
  • 引号 / 括号自动关闭:两个独立开关共用一份可编辑的匹配列表(默认提供 18 对)
    • 软键盘:修改搜狗原生配对,改用自定义列表
    • 物理键盘:打字即自动补闭字符,Ctrl+Shift+9 可临时切换开关
    • 有选区时包裹选区而不是替换它;光标后侧已有闭字符时只移光标,这和部分 IDE 行为相似
  • 完整的 …… 和 ——:破折号/省略号直接打出两个
  • 选区与分词修复:部分宿主(Lexical / WebView 类输入框)把 extendmove 用, Shift/Ctrl + 方向键无法选字/选词 —— 开启后由模块接管并推进选区 (Shift+←/→ 逐字、Ctrl+←/→ 按词、Ctrl+Shift+←/→ 按词选)
  • 解除快捷键设置限制:搜狗「外接键盘设置」默认不让录 Alt/Shift+字母的组合,开启后可录 (顺带修掉"两个热键都清空却被报『与…快捷键冲突』")
  • 更好的软硬键盘切换:本平台在物理键盘态下点输入框会弹出软键盘,而软键盘一出现物理键盘工具条 就被销毁、物理键盘热键(含 Alt+字母)全部失效。开启后由模块接管切换:
    • 物理键盘态下点输入框不再掉回软键盘,软键盘态下点输入框正常弹出
    • 切到软键盘:CSP(搜狗里设的软硬切换热键)/ 工具栏最右的「软键盘」按钮 / 2 秒内进-出-进同一个输入框 / 长按设置里的这一行
    • 切到物理键盘:直接用物理键盘打字,或长按这一行
    • 设置行里有 [查看切换规则],弹窗会列出上面这些动作,并显示你在搜狗里绑的热键
    • 滚动区右下角有悬浮的「刷新状态」按钮,状态不同步时点一下
  • 配置热生效 —— 通过广播更新配置,另外每 5 秒懒检查配置变化,更新配置无需重启输入法
  • 与 BetterZUIKey 联动 —— 若安装了 BetterZUIKey 会给出配置建议

工作原理

模块在搜狗 IME 进程里做五件事:注入 subtype / 推进 marker / 改写提交内容 / 配对与引号 / 光标兜底

模块 App(MainActivity)
    ↕ ContentProvider IPC(ConfigProvider · 每 2 秒轮询 + 签名比对)+ ConfigPoke 广播即时戳一下
搜狗 IME 进程(BridgeHook)
    ├── SubtypeInjector   用搜狗自己的 uid 补 subtype(绕开 setAdditionalInputMethodSubtypes 的闸门)
    ├── SogouTranslator   marker 推进 / 语言切换命令 / 快捷键与热键 / 配置热重载
    ├── PunctPipeline     在 commitText 上做「语义层 → 形式层」的标点改写
    └── AutoPairHook      配对三件套:闸门 UU.a · 自定义表 Yja.a · 引号标志位 KG.d
                          · 软键盘:闸门放行,由搜狗按自定义表提交开+闭
                          · 物理键盘:闸门拦住搜狗,改由模块注入闭字符并把光标移进中间
                          · 有选区:不让原提交走,改由模块提交「开 + 选区 + 闭」
                          · 闭合符已在光标后:只把光标移过去(按过闭字符 / 用户点过别处即恢复)
  • 自定义表若留空则继续走搜狗原有的配对规则
  • 中文引号由 KG.d 决定,每按一次就翻转 KG.e/KG.f。模块一次上屏两个字符,就得多替它翻一格,否则下一次按键只吐出一个
  • 配对之后的光标由搜狗的 Qja.setSelection 定:它那次是排队执行的、而且比模块返回还晚,所以只能改写它那次请求的参数,不能自己再设一遍
  • subtype 顺序 = 框架 enabled subtype 列表顺序
  • 若由于版本更新导致内部符号变化则退回合成 Shift / 走默认表,避免造成崩溃
  • dex 级逆向、踩坑与实测数据全部整理在 PRINCIPLE.md

模块安装

  1. 前置条件:已安装 LSPosed + 联想 OEM 版搜狗输入法

    包名 com.sohu.inputmethod.sogou.oem
    版本 versionCode 29496052 / versionName 1.0.android_pad_lenovo_2024.20260130165252
    来源 联想平板 TB710FU(Android 16)预装,位于 /system/preinstall/SogouInput

    模块按这个版本的搜狗内部符号实现(实测 + 逆向均基于它)。其他版本可能符号不同,届时功能可能会降级(而不会崩溃),但请以本表版本为准。

  2. Releases 下载 APK 并安装

  3. LSPosed Manager 里启用模块即可 —— 作用域由模块静态声明无需也无法手动勾选

  4. 打开模块 App,勾好要暴露给框架的语言

  5. 杀死输入法进程

  6. 多次进入/退出编辑以触发键盘弹出

若要使用“只响应系统框架语言切换消息”功能,需要 BZK v1.7.0 以上。 1.6.x 亦可联动部分功能,但无法使用轮转顺序自定义功能,系统框架只能切换最近使用的 2 门语言。

开发构建

git clone git@github.com:CommandPrompt-Wang/BetterZUIKey-SogouOEMExt.git
cd BetterZUIKey-SogouOEMExt
./gradlew :app:assembleDebug
# APK: app/build/outputs/apk/debug/BetterZUIKey-SogouOEMExt-v<versionName>.apk

需要 JDK 17 + Android SDK 37(compileSdk 37 / minSdk 27 / targetSdk 36),以及 libxposedxposedminversion=93)。

  • 请自备 app-sign.keystorekeystore.properties

使用方法

主页只决定「暴露哪些语言」:勾哪个,哪个语言才会被做成 subtype 交给框架;顺序不在这里(那是 BetterZUIKey 的事)。

下面每项一张卡片,开关与热键:

功能 解释 默认值
智能中文标点 更合理的中文标点符号,使用半角的 +-*#[] 等符号
智能编号 中文模式下,任意数字后面的 改用半角,以形成 1. 2) 这类编号
大写字母进拼音栏 中文态下 Shift+字母也整词进拼音,上屏时按记录还原大小写
切换快捷键:Ctrl+Shift+9
引号/括号自动补全 软键盘打 → 自动补 并把光标移进中间;配对规则来自「编辑匹配列表」
物理键盘自动补全 物理键盘打 → 模块注入 并移光标;Ctrl+Shift+9 可临时开关
选区自动补全 选中文本时用配对标点包住(abc(abc)),而不是替换掉选区
跳过已存在的闭合符号 光标后侧已有闭合符时只移光标、不再多出一个;手动移动光标后恢复正常闭合
完整的 ……—— 输入 / 时输出两个(关闭则恢复搜狗原生单出)
全角模式 标点与数字全部输出全角( ),关闭则半角
切换快捷键:Shift+Space
中英文标点 中文态下也输出 ASCII 标点(英文标点模式)
切换快捷键:Ctrl+.
只响应系统框架语言切换消息 严格模式:屏蔽搜狗原生切换键,只接受框架信号
选区与分词修复 坏宿主(Lexical / WebView 类输入框)里 Shift/Ctrl+方向键选不了字、选不了词,开启后由模块接管推进选区
解除快捷键设置限制 搜狗「外接键盘设置」里能录 Alt/Shift+字母 的组合(放开后冲突与被上层应用抢占需自行判断)
更好的软硬键盘切换 物理键盘态下点输入框不再弹软键盘;状态行显示「物理键盘 / 软键盘」,长按条目可应急切换
切到软键盘:搜狗软硬切换热键 / 工具栏最右的「软键盘」按钮 / 2 秒内进-出-进同一输入框
切到物理键盘:用物理键盘打字
条目「编辑匹配列表」 自定义「前-后」配对串,长度必须是偶数;留空 = 用输入法默认匹配规则 18 对建议值
条目「原样输出斜杠」 搜狗把 /\ 都输出成 ;可以选一个原样保留

三个状态位(全角 / 中英标点 / 物理补全)才有快捷键;其余都是纯开关,改完即时生效。 「更好的软硬键盘切换」另有状态行(物理键盘 / 软键盘),它的快捷键用的是搜狗「外接键盘设置」里绑的那一个。 进设置页会异步拉一次真实状态:先显示「获取中……」,5 秒没回应就显示「获取超时」;滚动区右下角那个悬浮按钮可以随时手动刷新。

日志:

adb shell logcat -s BZK-SogouOEMExt

config -> wubi,pinyin,en|2 | applied rotation=[wubi, pinyin] (was [pinyin, wubi])
sync marker: real=en cur=null -> want=pinyin
marker repositioned to pinyin in 1 step(s)
punct: { -> { [half] [cn]
provider: dump self-check = ok (pairMap=18 pairs)

⚠️ 免责声明

这是一个 LSPosed 模块,直接 hook 输入法的输入链路与提交链路。使用前请:

  • 先读内置的「原理 / 说明」,理解每个开关的含义再动手
  • 不当配置可能导致切不到某个语言、标点/配对行为异常
  • 只针对 com.sohu.inputmethod.sogou.oem联想 OEM 版 29496052 / 1.0.android_pad_lenovo_2024.20260130165252,对公版搜狗、其他厂商 OEM 版、以及其他版本号一律无效

开发者不承担因使用本模块造成的输入异常、数据丢失或设备故障的任何责任。

项目结构

app/src/main/java/moe/lovefirefly/bzk/sogouoemext/
├── BridgeHook.java          # Xposed 入口 + 开发期开关(DEV_*)
├── SogouTranslator.java     # 核心:subtype 注入时机 / marker 推进 / 快捷键与热键 / 配置轮询
├── SubtypeInjector.java     # 用搜狗身份补 subtype(绕开 uid 闸门)
├── PunctPipeline.java       # 标点管线:语义层(中/英/数字/斜杠)→ 形式层(全/半角)
├── AutoPairHook.java        # 引号括号:UU.a 闸门 · Yja.a 自定义表 · KG.d 引号标志位
│                            #   软键盘放行搜狗配对;物理键盘拦住搜狗、改由模块注入闭字符
│                            #   有选区则包裹;闭字符已在光标后则只移光标(含 Qja.setSelection 改写)
├── ShiftArrowRepair.java    # 选区接管:Shift/Ctrl+方向键逐次核对期望焦点,坏宿主由模块推进
├── HotkeyLimitUnlock.java   # 「解除快捷键设置限制」:运行时认出组合键校验器并放行 Alt/Shift
├── HardKeyboardLock.java    # 软硬键盘状态机:iP.a(2) 与 Lta 写点取舍 + jua 切软 + 同框双击判定
├── LangConfig.java          # 配置:dump / parseDump / signature,配对串解析成 Map
├── LangSpec.java            # 语言规格常量(语言清单、默认暴露集合、默认值)
├── ConfigProvider.java      # ContentProvider:App → 模块 的配置通道(含 UID 白名单)
├── ConfigPoke.java          # 配置即时生效:App 发一条不带数据的广播,模块立刻重读
├── MainActivity.java        # 首页:语言暴露勾选 + 所有开关(launcher)
├── InfoActivity.java        # 「原理 / 说明」页
├── InfoText.java            # 说明文案
├── Sogou*Probe.java         # 开发期探针:命令注册表 / 状态字段 / 按键路径 / 标点提交点 / subtype 写回
└── SogouStateWatch.java     # 开发期探针:每 500ms 采样 LUa.F(),只在变化时打日志

📄 许可证

GPL-3.0 © 2025–2026 CommandPrompt-Wang

About

为搜狗输入法联想版开发的增强模块

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages