Android RIME 输入法 —— librime 引擎 + Jetpack Compose 声明式键盘(键面、图标与 ○ 圆环为手绘),方案组零拷贝架构,支持本地语音识别。
· 最新安装包见 Releases ,该输入法为个人使用输入法,有问题欢迎issues,更好的方式是fork后让AI修改,更快实现你的想法 开发方式:本项目从架构设计、功能实现、界面改造到文档与 CI 排障,全程由 AI 协作完成 (AI 生成代码与文档,人工负责需求、调参与验收)。AI 在实现过程中参考的上游项目见文末「借鉴与引用」。
工具栏正中那颗 ○ 圆环,灵感来自 BlackBerry 的轨迹球。
它的手势与对应的轨迹球习惯:
- 点击 —— 呼出 ○ 菜单
- 长按 —— 语音输入
- 左右拖动 —— 移动光标
- 下滑 —— 收起键盘
- 上滑 —— 快捷应用悬浮栏:5 个应用槽位,滑动选择、松手启动,下滑取消
圆环有三种形态(设置 → O 圆环):
- 圆形环 —— 呼吸环(默认),颜色随主题深浅自适应
- 圆角方形环 —— 方形描边,硬朗
- 眼睛 —— 环内一双眼睛,会随机做表情:眨眼、连眨两下、左右看、上下看、眯眼、惊讶、困倦、笑眼、转圈看、生气,共十套动作,间隔 2~9 秒随机出现
设置 → 主题与配色里是一个下拉栏,选中即生效(键盘与设置页一起变):
目前提供 Material / Miuix / One UI 三种
- Material —— 中性灰 + 白键,最朴素的底色
- Miuix —— MIUI 风格扁平:页面浅灰、卡片纯白、工具栏纯白
- One UI —— 大圆角 + 键面柔和阴影 + 半粗字重
风格只改视觉(配色、描边、阴影、字重、字体),不动你亲手调好的键高、行距、圆角。想要整套风格连几何一起换,可以打开「几何也跟随风格」。
配色本身也开放:字母键(26 字母 + 逗号句号共享一色)、功能键(Shift / 符号 / 退格共享一色)、强调键(回车与高亮),亮色与暗色各存一套。取色用调色板 + 十六进制 + 透明度滑杆。默认按原色呈现,“被半透明冲淡的柔和观感”需要主动关闭原色开关。
- 主键盘:26 键(默认),九宫格,十四键
- 其他键盘页:九宫格数字、26 键符号、全部符号(分类网格,含「中文符号 / 英文符号」)、emoji
- 横屏自适应:沿用同一套布局,只把键高限低 25%,避免横屏时键盘占掉大半个屏幕
- 键盘编辑器:可视化网格编辑,标签 / code / 宽度 / 高度系数 / 长按 / 上下左右四向滑动 / 角标提示,可增删键与行;编辑器里附内置功能键值清单
- 长按一个字段管两件事:填单个动作或符号就直接执行;空格分隔多个则是长按气泡
- 符号随中英切换:键面长按符号与长按气泡会在中文标点与 ASCII 之间自动切换(h→
_、m→:、,→!、.→?、k→ASCII 括号) - 空格:长按连续输入空格(和电脑空格键一样),上滑切换中英
- 单手模式(键盘缩到一侧)与悬浮模式(键盘缩小、可整体拖动)
- 工具栏工具默认不显示,自行勾选:剪贴板、方案、数字、emoji、符号、设置、语音、收起、中英、撤回、重做、单手、悬浮
- 四向滑动直出符号;长按弹出符号气泡,气泡内可滑动选择,多行气泡支持上滑换行
- 退格左滑选择删除、上滑全清、下滑撤回(操作栈:插入可删、删除可恢复)
- 键面四向提示按字面方向显示;长按提示在右上角
- 括号类符号上屏后光标自动停在括号中间(
{text}{Left}语法,用setSelection实现) - 振动与音效统一在按下瞬间触发,三个键盘页手感一致
- 符号键长按呼出popup可选默认打开九宫格数字键or26键符号键盘
- librime(
librime_jni.so)+ 方案组架构:组目录即 librime 的 user 数据目录,零拷贝加载 - 方案组切换、ZIP / SAF 文件夹导入、方案重命名、导入后全量部署
- 候选横滚 + 数字前缀选词 + 更多候选网格面板(◀▶ 翻页);面板里每个候选的注释(拆字 / 拼音)显示在字的上方,背景随文字长度伸缩
- 方案切换:工具栏「方案」按钮 → 键盘下方中间的横向悬浮栏,点一下即切
- 拆字与缺字兜底:字体回退链末尾追加系统字体,自定义字体缺部首字形(如 ⺮ 龸 亻)时不再出现豆腐块
- 输入框类型自动切页:数字与电话框自动切九宫格;密码、邮箱、网址框自动切英文;回到普通文本框自动恢复中文(只恢复它自己切过去的那一次,不干扰你手动切换)
- SenseVoice(离线) —— 本地 int8 模型,中 / 英 / 日 / 韩 / 粤,松手出全文
- 流式 zipformer(离线) —— 边说边出字
- 联网 API —— 任意 OpenAI 兼容的
/v1/audio/transcriptions,自填地址、密钥与模型
模型侧载在 Documents/Oime/models/,缺模型时按键给出提示而不是崩溃。语音识别可选用的联网服务商(含豆包 / 火山引擎的接入方式与限制)见 DOUBAO_ASR_REPORT.md。
剪贴板历史与收藏短语双选项卡、卡片列表、︙ 菜单(收藏 / 置顶 / 分词 / 删除 / 全清)。
复制之后工具栏常驻一条复制条:点击内容上屏,右侧 ✕ 消亡(消亡时震动提示)。不用先上屏就能清掉强制复制的无效内容,打字过程不会让它消失。可在设置里整体关闭——关闭后不再监听剪贴板。
长文本上屏用的是完整文本,显示才做截断;复制新内容永远会重新出现(上屏或消亡过的条目不会自己冒出来)。
跟随光标显示(requestCursorUpdates + CursorAnchorInfo):悬浮窗里给出输入码前几码与候选,余下的码仍在工具栏。
可调项:背景色(取色板,默认跟随主题)、首选候选加强调底色、显示候选数量、候选横向或竖向排列、位置、字号、背景不透明度。
- 自绘图标集 OimeIcons:24 网格手绘,跟随主题着色,回车键是一架纸飞机
- 键高、增高行、工具栏高度、按键圆角、行距、列距、键盘字号、工具栏字号分别可调
- 多字体回退链,键帽字体与候选字体可分别选用
- 空格键自定义文本支持用空格微调位置,另有一条位置滑杆
- 导航栏(键盘下方那条系统区域)颜色直接取键盘底色,换风格、切深浅色都一起跟随
打字音效默认关闭。打开后从外置文件夹读取,目录是 Documents/Oime/sounds/(安装后自动创建),支持 mp3 / ogg / wav / m4a。
目录里已经放了一份内置默认音效 click.ogg,所以打开开关即可出声;想换音效把自己的文件丢进这个目录,在设置里试听、选择、调音量。同名文件不会被覆盖,替换后也不会被还原。关闭时热路径零开销。
按键动作用内置功能键值,命名对齐 RIME:
- 编辑:
select_all、cut、copy、paste、undo、delete_all - 上屏:
newline(同return/enter)、space、tab、backspace、delete - 中英:
toggle_ascii(同ascii_mode)、caps_lock、shift - 光标:
left、right、up、down、home、end - 翻页:
prior(同page_up)、next(同page_down) - 组合:
esc(同escape)、clear - 页面:
page:main、page:symbols、page:numpad、page:emoji - Oime 内置:
deploy、switch_ime、clipboard、menu
大小写、连字符、下划线都容错;不认识的写法按字面文本上屏(支持 {Left} / {Right} 光标后缀)。完整清单也印在键盘编辑器里。
- 首次向导 7 页:存储权限 → 启用输入法 → 选择输入法 → 语音输入权限 → 联网与模型下载 → 进入设置 → O 圆环快捷应用
- ○ 圆环上滑快捷启动:5 个应用槽位可自定义(需要
QUERY_ALL_PACKAGES) - ○ 菜单里有「切换输入法」,一键唤起系统输入法选择器
- 省电:热路径零 IO(方案显示名、方案列表都缓存或按需取)、动画降帧、键盘收起即关面板、退出时释放 librime 与语音 ONNX 会话。按手机侧归一化口径实测,UID 归因耗电较优化前下降约 68%
- 诊断:运行日志统一写在
Documents/Oime/logs/(默认只记错误与关键事件,几乎零开销),符号、光标、剪贴板、退格等关键路径都有埋点
○输入法站在这些项目的肩膀上,感谢作者们。
- rime/librime —— RIME 引擎本体
- osfans/trime —— 悬浮窗(编码预览)等交互的早期参考
- nirenr/trime2 —— 方案组架构(组目录即 librime user 目录、零拷贝)与生命周期管理
- ximeiorg/Xime —— 内置的 librime JNI 绑定、按键路由与键盘页思路
- k2-fsa/sherpa-onnx —— 本地语音识别(SenseVoice / 流式 zipformer)
- chongyangtao/DeepHCCR —— 本地手写识别(GoogLeNet,MIT 授权;本项目把它的 Caffe 权重转成量化 ONNX 后离线推理)
- rime/weasel —— 方案与词库的组织方式参考
- PiliPlus —— 底部悬浮栏(面板与 chip 条)样式参考
- tiann/KernelSU —— 设置主页的卡片式布局风格
仓库是公开仓库,构建全部交给 GitHub Actions,本机只做语法与类型校验:
./gradlew compileDebugKotlin # 本机校验,不出包推送到 main 后,Actions 会自动出包。开发期安装包:仓库 Actions → 最新一次 run → 下载工件 app-debug(内含按 ABI 拆分的 app-arm64-v8a-debug.apk 与 app-armeabi-v7a-debug.apk,下载需登录 GitHub,保留 3 天);正式版会发布到 Releases。语音依赖 sherpa-onnx-1.13.5.aar(约 49MB)不入库,CI 在构建前从官方 release 下载到 app/libs/。
- 技术栈:Kotlin 1.9.22 / AGP 8.3.0 / Gradle 8.4 / Compose BOM 2024.02.00 / JDK 17
- 引擎:
librime_jni.so(arm64-v8a / armeabi-v7a 两套);方案导入用 zip4j - 项目路径含非 ASCII 字符时,需要
gradle.properties里的android.overridePathCheck=true
- 默认不联网:敲字、联想、方案与剪贴板全在本地完成,除非你主动选择「联网 API」语音引擎并自行填写地址与密钥。
- 剪贴板:复制条与剪贴板历史只在本机读写,不上传;可以在设置里整体关闭,关闭后不再监听剪贴板。
- 语音:默认可选两个离线引擎(模型放在
Documents/Oime/models/),全程不出本机。 - 日志:诊断日志只写在本机
Documents/Oime/logs/,不会自动外发。 - 权限:除输入法本身所需(读取剪贴板、振动、录音、读写外置目录)外,
QUERY_ALL_PACKAGES仅用于 ○ 圆环的上滑快捷启动列表。
- 全程 AI 协作:本项目的代码、界面、文档(含本 README 与各阶段报告)以及 CI 排障,均由 AI 编程助手(WorkBuddy)协作完成; 人负责提需求、给反馈、验收与调整参数——每轮改动都经过「编译校验 → 构建 → 真机验证」的闭环。
- AI 参考的项目:实现过程中的思路与代码来源是上游开源项目,见参考项目(RIME 引擎与生态、trime / trime2 的方案组架构、Xime 的 JNI 绑定、sherpa-onnx 的语音模型, 以及若干 UI 项目的交互设计)。所有引用到的项目版权归各自作者所有。
- 代码可信度:AI 生成的代码可能存在疏漏,欢迎通过 Issue 指出;本项目按 GPL-3.0 提供,不附加任何担保。
GPL-3.0。本项目是 RIME 生态的衍生作品,继承上游 GPL 许可;引用到的第三方项目版权归各自作者所有(见上文「参考项目」)。
这份 README 会随功能改造同步更新:新功能、新的借鉴来源、以及 ○ 圆环的新玩法,落地后都会补进来。
- 逐轮开发记录:DEVLOG.md
- 当前状态:BUILD_STATUS.md
- 阶段总结(耗电优化 / 交互定稿 / 外观与布局):PHASE_REPORT.md
- 界面风格调研:UI_STYLE_RESEARCH.md
- 语音联网方案调研:DOUBAO_ASR_REPORT.md
到 Releases 按 CPU 架构下载对应包:
| 文件 | 适用 |
|---|---|
oime-<版本>-arm64-v8a.apk |
绝大多数手机(2016 年后的 64 位机型) |
oime-<版本>-armeabi-v7a.apk |
32 位机型(较老的设备;要求 Android 6.0+) |
不确定选哪个:先装
arm64-v8a;若提示「应用未安装 / 不兼容」,说明是 32 位机型,改装armeabi-v7a✓ x86 / x86_64(模拟器、极少数平板)暂不发布。
- 下载对应架构的 APK → 安装(系统可能提示"未知来源",允许即可)
- 打开 ○输入法 App → 按引导启用并切换输入法
- 首次启动会在
Documents/Oime/下自动建立目录:
Documents/Oime/
├── schemas/ 输入方案(虎码 / 双拼 / 白霜…,可直接往里放目录)
├── models/ 离线模型(语音 sense-voice / zipformer;手写 handwriting/)
│ 可在「设置 → 语音手写管理」里一键下载,也可自行放入
├── downloads/ 模型下载临时文件(解压完成后自动删除;中断的断点可续传)
├── fonts/ 键盘字体(放 .ttf / .otf 即可在设置里选)
├── sounds/ 按键音效
├── backup/ 设置备份(JSON)
└── logs/ 运行日志(按天分文件,自动保留 7 天)
| 项 | 支持 |
|---|---|
| 系统 | Android 6.0+(minSdk 23,targetSdk 34) |
| CPU | arm64-v8a ✓ 与 armeabi-v7a ✓ —— 各自独立出包(v7a 要求 Android 6.0+) x86 / x86_64 —— 暂不发布(无设备测试) |
发行包使用正式发布密钥签名(不再使用 debug 密钥)✓
- 密钥保存在 GitHub Secrets(
SIGNING_KEY/SIGNING_KEY_ALIAS/SIGNING_STORE_PASSWORD/SIGNING_KEY_PASSWORD), 不进仓库 ✓;CI 构建时通过环境变量注入 - 本地或 fork 若没有配置这些 Secrets,会自动回退 debug 签名,仍然可以正常构建 ✓
⚠️ 升级提示:0.9.x / 早期 1.0.0 的包是 debug 签名的,与正式签名不兼容 ⇒ 首次安装正式签名版需要先卸载旧版(会清掉应用数据;输入方案与词库在Documents/Oime/下不受影响 ✓)
- 不采集任何输入内容、设备标识,无统计/遥测 SDK;数据全部在
Documents/Oime/,只存在本机 - 权限用途:录音(仅长按 ○ 键听写时)、存储/使用情况(读写
Documents/Oime/)、 网络(仅在你主动操作时:打开链接 / 自填的联网语音 API / 手动下载方案) - 详细条款见 App 内 设置 → 关于 → 隐私条约;开源组件与许可见 关于 → 开源许可
- 位置:
Documents/Oime/logs/oime-YYYY-MM-DD.log(崩溃另有crash-YYYY-MM-DD.log,含设备信息) - 默认只记错误 / 警告 / 关键事件(几乎不耗电); 需要详细埋点(按键/候选/光标)时到 设置 → 关于 → 日志 → 详细日志 打开即可 ✓
本仓库的 CI 只依赖公开资源,fork 后无需任何配置即可直接跑:
- 工作流:
.github/workflows/android.yml(push main/develop、PR、也可手动workflow_dispatch) - 无 secrets / 无私有 token / 无仓库硬编码(不校验 owner/repo)
- JDK 17(temurin)+ 标准 Android SDK(ubuntu-latest 自带)
sherpa-onnx-1.13.5.aar(约 49MB,超 GitHub API 单文件限制)不入库, 由 CI 从官方 release 下载(公开 URL)librime_jni.so、RIME 资源、内置音效等都在仓库内,无需额外准备- 产物:
app-debug工件(保留 3 天),内含按 ABI 拆分的app-arm64-v8a-debug.apk与app-armeabi-v7a-debug.apk(路径app/build/outputs/apk/debug/)
唯一注意:cache: gradle 对 public 仓库免费;若你的 fork 是 private,
Gradle 缓存会占用 500MB 存储额度(历史上曾因此导致上传步骤失败),
可把 setup-java 的 cache: gradle 一行删掉再跑。
本地构建(可选):在仓库根目录执行 ./gradlew assembleDebug 即可,
local.properties 中的 SDK 路径请按自己的机器填写(该文件不入库)。