HeliBoard 开源输入法深度解析:离线隐私、自定义布局与主题定制实战指南

发布时间:2026/10/9 13:54:50
HeliBoard 开源输入法深度解析:离线隐私、自定义布局与主题定制实战指南
移动开发【免费下载链接】HeliBoardCustomizable and privacy-conscious open-source keyboard项目地址https://gitcode.com/gh_mirrors/he/HeliBoard点击查看免费下载HeliBoard 是一款以隐私为核心、高度可定制的开源 Android 输入法基于 AOSP Keyboard 与 OpenBoard 二次开发而来全量功能 100% 离线运行。本文以仓库 README.md 为主体脉络结合 layouts.md 布局文档与app/src/main/java/helium314/keyboard下的真实源码实现系统讲解 HeliBoard 的核心能力——从字典与联想、主题定制、布局文件格式到剪贴板历史、单手模式、备份恢复等特性并给出可直接落地的配置与开发指引。读完本文你将掌握 HeliBoard 的架构思路、布局文件的两种格式与完整参数语义以及如何为它贡献自定义布局、字典和翻译。项目定位与离线隐私承诺HeliBoard 的核心卖点非常明确隐私友好privacy-conscious 高度可定制customizable。它不是又一个套壳键盘而是一个从 AOSP / OpenBoard 出发、持续迭代的开源实现仓库中的 README.md 开篇即声明HeliBoard is a privacy-conscious and customizable open-source keyboard, based on AOSP / OpenBoard. Does not use internet permission, and thus is 100% offline.这一无网络权限、100% 离线的承诺可以从 app/src/main/AndroidManifest.xml 得到源码级验证整个 Manifest 中只声明了READ_USER_DICTIONARY、RECEIVE_BOOT_COMPLETED、VIBRATE、WRITE_USER_DICTIONARY、READ_CONTACTS五个权限没有任何android.permission.INTERNET。也就是说联想、拼写检查、剪贴板、主题等所有数据都留在本地设备上从权限层面杜绝了遥测与数据外传的可能。从源码结构看app/src/main/java/helium314/keyboard/latin/HeliBoard 沿用了 AOSP LatinIME 的分层骨架LatinIME.java输入法服务入口对应 Manifest 中注册的LatinIMEServiceBIND_INPUT_METHODsettings/完整的设置体系主题、布局、语言、工具栏、手势数据等keyboard/键盘视图、按键解析、Emoji 面板等渲染与交互层dictionary/、suggestions/本地字典与联想引擎spellcheck/独立的拼写检查服务AndroidSpellCheckerService。这样一个输入法服务 拼写检查服务 设置活动的架构让 HeliBoard 既能作为 IME 使用也能被系统拼写检查框架调用。核心功能全景README 的 Features 一节给出了 HeliBoard 的功能清单以下结合源码逐一展开。字典与联想Dictionaries可添加字典用于联想与拼写检查HeliBoard 支持用户自建字典或从公开的 aosp-dictionaries 仓库获取现成字典质量因人而异。仓库自带了一批预编译字典位于 app/src/main/assets/dicts/覆盖main_bg保加利亚语、main_de德语、main_en-US、main_es、main_fr、main_ru等近 20 种语言。emoji / 科学符号字典除了常规文字字典还可以挂载emoji 字典或科学符号字典来提供类似 emoji 搜索的联想建议。韩语布局的特殊性README 特别提醒韩语布局的联想只能使用特定词典OpenBoard 的一个 commit 提供的dictionary 仓库里的工具无法生成可用的韩语词典。与字典相关的实现包括dictionarypack/字典包安装广播DictionaryPackInstallBroadcastReceiver与makedict/字典编译工具Manifest 中注册的SettingsActivity2还带有application/octet-stream*.dict的 intent-filter可以直接用文件管理器打开.dict文件完成安装——这是外部字典即点即装的入口。主题定制ThemesHeliBoard 允许自定义键盘主题的风格、颜色与背景图片。设置入口在 settings/screens/ColorsScreen.kt 与 settings/screens/AppearanceScreen.kt主题相关的资源定义在 app/src/main/res/values/如colors.xml、attrs.xml中。两点值得注意的适配能力README 明确列出Android 10部分 Android 9 版本可跟随系统的日/夜模式自动切换主题Android 12 可跟随系统的动态取色Material You 动态色。此外README 提到主题可以通过adjust colors调整颜色界面右上角菜单保存与加载社区里也有人在专门的主题讨论区分享自定义配色。布局定制Layouts这是 HeliBoard 最有特色的部分之一可以自定义主键盘布局以及符号、数字、功能键等特殊布局但前提是关闭使用系统语言use system languages设置。完整的布局格式规范记录在仓库根目录 layouts.md本文后面有专门章节详解。多语言输入Multilingual TypingHeliBoard 支持多语言混输即在一个键盘上启用多种语言输入时可以混用各语言的字典。语言与子类型subtype的注册在 app/src/main/res/xml/method.xml每个 subtype 通过android:imeSubtypeExtraValue指定其KeyboardLayoutSet对应的布局文件。滑行输入Glide Typing——唯一的闭源例外README 用了一个苦笑表情☹️来说明滑行输入只能使用闭源库。由于目前没有兼容的开源库该库并未打包进应用。用户有两种获取途径从 GApps 包里提取即 swypelibs从 erkserkserks/openboard 的app/src/main/jniLibs目录下载对应文件点击文件后选 raw 或小下载按钮。设置界面中的GestureTypingScreen.kt即滑行输入相关设置项。这是 HeliBoard 在完全开源与滑行体验之间做的务实取舍使用前需要自行评估闭源库的隐私影响。剪贴板历史Clipboard History剪贴板历史功能由 latin/ClipboardHistoryManager.kt 实现底层通过ClipboardDaoRoom 数据库持久化剪贴板条目并提供ClipboardContentProviderManifest 中注册的ClipboardContentProvider供内部粘贴文件使用。剪贴板历史界面布局见 res/layout/clipboard_history_view.xml还有独立的ClipboardHistoryEntry.kt数据模型。单手模式与分体键盘One-handed SplitHeliBoard 内置单手模式one-handed mode与分体键盘split keyboard相关状态与切换逻辑可在 keyboard/KeyboardSwitcher.java、KeyboardState.kt 中找到搜oneHanded相关字段即见。单手模式的开关按键图标也预置在 res/drawable/sym_keyboard_start_onehanded_lxx.xml 等资源中。数字键盘Number Pad提供独立数字键盘numpad布局对应 assets 中的 layouts/numpad/ 与 layouts/numpad_landscape/ JSON 布局文件。备份与恢复Backup RestoreHeliBoard 支持备份并恢复设置、已学习的单词与历史数据。设置与学习数据分别存储可备份的内容包括设置偏好与个人字典/词频数据具体入口在设置界面PreferencesScreen相关区域这也是换机或重装后快速还原输入习惯的实用功能。布局文件格式详解基于 layouts.mdlayouts.md 是官方布局文档HeliBoard 支持两种布局格式简单文本格式与 JSON 格式都通过设置界面直接添加。简单格式Simple Format每行一个按键两行之间用一个空行分隔表示换行。按键格式[label] [popup keys]用空格分隔。例如a 0 *表示一个输出a的按键长按弹出0、、*三个候选键。经典示例即仓库自带 app/src/main/assets/layouts/main/qwerty.txtq w e r t y u i o p a s d f g h j k l z x c v b n mJSON 格式JSON FormatJSON 格式源自 FlorisBoard 的布局规范但 HeliBoard 目前只支持普通按键不支持 action key 之类。解析采用 lenient 模式并忽略以//开头的行因此你可以直接在 JSON 里写注释。仓库自带示例 app/src/main/assets/layouts/main/azerty.json[ [ { label: a }, { label: z }, { label: e }, { label: r }, { label: t }, { label: y }, { label: u }, { label: i }, { label: o }, { label: p } ], [ { label: q }, { label: s }, { label: d }, { label: f }, { label: g }, { label: h }, { label: j }, { label: k }, { label: l }, { label: m } ], [ { label: w }, { label: x }, { label: c }, { label: v }, { label: b }, { label: n }, { $: shift_state_selector, shiftedManual: { label: ? }, default: { label: } } ] ]JSON 格式相对简单格式的优势在于更高的灵活性可以根据输入类型、Shift 状态或布局方向切换按键。通用注意事项layouts.md 明确警告按键过多或文本过长会让键盘变形甚至崩溃弹出键尤其容易出问题添加布局时有基本的 sanity check但并不覆盖所有情况布局不校验是否真的包含所选语言的字符若使用外部滑行输入库布局中不能有重复键或超过单个字符的键若布局底行恰好只有 2 个键这两个键会替换掉逗号与句号键精确来说第一个键替换底行第一个groupId: 1的功能键第二个键替换第一个groupId: 2的键。按键类Key Classes用$指定按键类通常可以省略类名作用text_key普通按键默认值auto_text_keyFlorisBoard 中用于 Shift 时改变大小写HeliBoard 默认已自动做大小写转换除非用labelFlags禁用multi_text_key一次输入多个码点如{ $: multi_text_key, codePoints: [2509, 2480], label: ্র }case_selector按大小写切换lower、upper均必填shift_state_selector按 Shift 状态切换unshifted、shifted、shiftedManual、shiftedAutomatic、capsLock、manualOrLocked、default均可选variation_selector按输入类型切换datetime、time、date、password、normal、uri、email、default均可选keyboard_state_selector按键盘视图切换emojiKeyEnabled、languageKeyEnabled、symbols、moreSymbols、dpad、alphabet、default均可选layout_direction_selector按书写方向切换ltr、rtl均必填keyboard_state_selector中emoji/languageKeyEnabled在对应设置开启时生效symbols/moreSymbols/dpad/alphabet则在对应键盘视图激活时生效。选择器类按键的完整示例可参考 app/src/main/assets/layouts/main/dvorak.json。按键属性Propertiestype背景类型一般自动推断normal普通键色function功能键色space空格键色action动作键色unspecified无背景色placeholder无背景、无标签、按下无动作numeric普通键色仅数字布局中生效——未指定宽度时默认-1未指定 label flags 时设置默认值还有其他值但无效。code按下时输入的码点默认由 label 自动推导multi_text_key不可用。特殊负值功能键等见 keyboard/internal/keyboard_parser/floris/KeyCode.kt其中部分键码尚未支持可在checkAndConvertCode函数中确认哪些可用。修饰键说明CTRL、ALT、FN、META及左/右/锁定版本锁定版CTRL_LOCK等会一直保持激活直到再次按下普通版保持激活直到松开或发生一次码点输入取较晚者建议避免同一键盘上同时存在某键的锁定版与非锁定版二者会相互干扰部分应用只响应特定_LEFT或_RIGHT版本的 meta 键。codePoints多码点输入仅multi_text_key可用。label键上显示文本为空时由 code 推导。特殊值见下文 Labels 节。groupId附加弹出键组。0默认无附加1附加逗号弹出键2附加句号弹出键3附加动作键弹出键效果略怪-1抑制基于 label 的附加弹出。popup键的弹出键列表例如label: ), popup: {relevant: [{ label: . }]}表示)键带.弹出键。注意弹出键内属性只有$、code、codePoints、label生效其余被忽略弹出键中使用选择器类会正确求值例如随 Shift 状态切换弹出内容给重复键删除键、方向键加弹出键会禁用其重复功能KeyCode.KEY_REPEAT只允许出现在弹出键里不显示弹窗长按改为重复输入。width键宽单位为屏幕宽度比例如width: 0.1即屏幕宽度 10%默认0-1自动扩展占满其余可用空间如空格键0的解析规则字母/符号布局的空格键或数字布局中type: numeric的键 →-1数字布局 →0.17手机 →0.1平板 →0.09若一行宽度总和超过 1按键会被等比缩放以适应屏幕。labelFlags按键标签特效。名称与数值见 app/src/main/res/values/attrs.xml 的keyLabelFlags一节同行的注释里有十进制数值因为 JSON 不支持十六进制。组合多个 flag 需按位或多数情况下直接相加即可例外是fontDefault、followKeyLabelRatio、followKeyHintLabelRatio、autoScale。特殊标签Labels货币键$$$替换为当前布局语言对应的本地货币符号若未定义弹出键会自动附加前 4 个额外货币作为弹出$$$1~$$$5替换为长按货币键时提供的各货币符号。功能键不完整列表标签作用_alpha切换到字母键盘手机布局则切回主手机键盘_symbol切换到符号键盘手机布局则切到手机符号键盘_symbol_alpha在字母/符号键盘间切换_numpad切换数字键盘布局_dpad切换 D-pad 布局_emoji切换到 Emoji 视图_com显示常用顶级域名.com 等本地化_language_switch语言切换键_action动作回车键_delete删除键_shiftShift 键符号布局中会改变标签_period带标点弹出键的.键适配语言专属句号_comma带特殊弹出键的,键适配语言专属逗号URL 字段显示/email 字段显示_space空格键数字布局中带图标_zwnj零宽不连字符部分语言的字母布局中会自动出现在空格旁此外还可以使用工具栏键如_undo定义见 latin/utils/ToolbarUtils.kt更多可解析的标签见 keyboard/internal/keyboard_parser/floris/KeyLabel.kt。标签转义与文本/输入分离若标签与特殊功能冲突在文本前加\如\space会显示文本space而不是空格键JSON 中需写成\\space用[label]|[text]分离显示文本与输入文本aa|bb显示aa按下输入bb也可在标签中直接指定键码如a|!code/key_action_previous或abc|!code/-10043但建议用 JSON 布局显式指定code标签中的 code 会被 JSON 中的 code 覆盖图标标签!icon/previous_key|!code/key_action_previous。可用图标名见 keyboard/internal/KeyboardIconsSet.kt也可用工具栏键图标的大写名称如!icon/redo。弹出键专用标签置于弹出键上!noPanelAutoPopupKey!不显示弹窗长按直接选中该键的第一个普通弹出键!needsDividers!弹出键之间显示分隔线!hasLabels!缩小弹出键文字更适合显示标签而非字母!autoColumnOrder!带数字使用如!autoColumnOrder!4表示 4 列弹出键!fixedColumnOrder!带数字使用如!fixedColumnOrder!4表示 4 列且单行时不重排。为 HeliBoard 添加新布局/新语言layouts.md 给出了完整的新增布局/语言流程适用于想为仓库贡献或本地深度定制的开发者准备布局文件按上面两种格式之一编写放入 app/src/main/assets/layouts/如main/、symbols/、number/等目录。布局中的弹出键会归入 Layout 弹出键组若是 JSON 布局只在必要时添加$与code。在 app/src/main/res/xml/method.xml 注册布局android:imeSubtypeExtraValue的KeyboardLayoutSet设为布局文件名不含扩展名android:subtypeId必须在此文件内唯一与其他布局保持相同位数若给已有语言加布局需新增一个字符串替换subtype_generic新字符串加入默认 app/src/main/res/values/strings.xml可加其他语言翻译%s会被替换为语言名。新语言可提供 locale_key_texts 文件包含多个可选段[popup_keys]与该语言字母相近的弹出键如a配ä、य配य़。这类键不应写进布局会对该语言的所有布局含自定义布局生效归入 Language 弹出键组用%标记前面所有键为 Language (important)%之后的键仍在 Language 组punctuation键通常为句号键此处设置会覆盖默认值。[labels]可为symbol、alphabet、shift_symbol、shift_symbol_tablet、comma、period、question提供非默认标签。[number_row]自定义数字行1-9 和 0空格分隔。[extra_keys]显示在该语言默认布局中的额外键目前仅用于拉丁布局避免为右侧加几个键就复制整个布局布局名需以结尾查找时会被去掉。显示名与脚本Android 无显示名的新语言会用语言标签显示——可在 strings.xml 添加subtype_language tag并在 latin/common/LocaleUtils.kt 的localizedDisplayName中加overrideRedId空格键上显示的语言名则在 res/values/donottranslate.xml 的subtype_locale_displayed_in_root_locale与subtype_locale_displayed_in_root_locale_display_names中配置。若新语言不使用拉丁字母还需更新 latin/utils/ScriptUtils.kt 中默认脚本方法Locale.script。功能键布局Functional Key Layouts定制要点功能键布局的定制与普通布局类似但有专属规则默认功能布局中emoji、语言切换、数字键盘、D-pad 键其实始终存在只是根据设置与主布局字母/符号/更多符号被移除一旦自定义了任一功能布局这种移除即被禁用以便在字母布局中加入数字键盘键等。使用带 ZWNJ 键的语言时该键会自动加到底行第一个空格键右侧。给切换布局的键添加弹出键无法正常工作——通常按下瞬间布局就切换了。用type: placeholder键来做分隔分隔左右功能键如默认布局中的 shift 与 delete若想让功能键行对齐键盘顶部可加一行只有 placeholder 的行来分隔上下行。功能键最后一行若不包含 placeholder会被当作底行同默认功能布局。只给部分键盘字母/符号/更多符号定制功能键时的回退规则更多符号 → 符号 → 普通符号 → 普通 → 默认普通 → 默认。贡献指南与社区生态报告问题Reporting Issues遇到 bug 或想提新功能可以在 Issues 提交。提交前请自查是否已存在相同问题搜 open 与 closed 的 issue、是否已在新版本修复、是否单一主题多主题请拆分为多个 issue、是否使用了 issue 模板、是否由真人撰写。README 特别强调不要用 LLM 生成 issue用 LLM 辅助翻译等场景允许但必须声明参见 AI_USAGE.md。忽略模板的 issue 会被低优先级处理严重违反指南的可能会被直接关闭。翻译Translations翻译通过 Weblate 进行translate.codeberg.org/projects/heliboard需要账号才能更新翻译和新增语言在 Languages → Manage translated languages 中管理。PR 中直接更新翻译不会被接受以免与 Weblate 冲突。两点提示翻译 metadata 中的 changelog 意义不大hidden_features_message用 Weblate 翻译体验很差内容其实是 wiki 的副本仅因用户要求才放进应用。分享主题、布局与字典主题在adjust colors界面右上角菜单保存/加载自定义配色可在专门的讨论区分享社区已有主题合集仓库如 Star-Trowa/heliboard-themes、PickleHik3/droid-tings。布局自定义布局本质是文本文件内容可自由编辑、复制、分享——主键盘布局和高级设置里的特殊布局都适用规范见 layouts.mdRoccobots Layout Maker 是浏览器端的 JSON 布局编辑器。字典制作字典稍复杂。先准备词表格式见 aosp-dictionaries 仓库的 wordlists 与 readme再用外部工具aosp-dictionary-tools编译成字典文件产物最好连同词表可以分享。HeliBoard 本体不会再新增内置字典但可以往 dictionaries 仓库提交。代码贡献请遵循 CONTRIBUTING.md 的贡献规范。沟通渠道GitHub Discussions主题、布局、字典分享均有专属分区Lemmy 社区lemmy.world/c/HeliboardReddit 社区r/HeliBoard。许可证与致谢HeliBoard作为 OpenBoard 的 fork采用GPL-3.0强 copyleft 许可详见仓库 LICENSE由于底层基于 Apache-2.0 的 AOSP Keyboard同时提供 LICENSE-Apache-2.0 文件图标采用 CC BY-SA 4.0附带 LICENSE-CC-BY-SA-4.0 文件。项目致谢了 OpenBoard、AOSP KeyboardLatinIME、LineageOS、Simple Keyboard、Indic Keyboard、FlorisBoard 等上游项目与全体贡献者并通过 NLnet 基金会NGI Mobifree Fund获得资助同时受益于大量用户的捐赠。小结HeliBoard 的价值在于把离线隐私与深度可定制同时做到位无网络权限的 Manifest 设计从源头保证了数据不出设备两套布局格式加上完整的键类、属性、标签语义让用户能像写配置文件一样重塑键盘字典、主题、剪贴板历史、单手/分体模式、备份恢复等实用特性则覆盖了日常输入的绝大多数场景。本文依据 README.md 与 layouts.md 展开所有功能声明均有 AndroidManifest.xml 与 app/src/main/java/helium314/keyboard/ 下的源码佐证。想要深入某个特性直接阅读对应源码目录即可——例如布局解析看keyboard/internal/keyboard_parser/联想与字典看dictionary/与suggestions/设置体系看settings/。赞分享移动开发【免费下载链接】HeliBoardCustomizable and privacy-conscious open-source keyboard项目地址https://gitcode.com/gh_mirrors/he/HeliBoard点击查看免费下载相关推荐HeliBoard隐私优先、高度自定义的开源键盘HeliBoard隐私优先、高度自定义的开源键盘 项目介绍 HeliBoard 是一款基于 AOSPAndroid 开源项目和 OpenBoard 的隐私移动开发终极HeliBoard键盘布局指南从基础设置到高级自定义技巧终极HeliBoard键盘布局指南从基础设置到高级自定义技巧 HeliBoard是一款注重隐私保护且高度可定制的开源键盘应用基于AOSP/OpenBoard移动开发Redlib配置详解如何自定义主题、布局和隐私设置Redlib配置详解如何自定义主题、布局和隐私设置 Redlib是一款基于Rust开发的Reddit私有前端为用户提供高度可定制的浏览体验。通过Redlib上一篇CANN ops-math 之 ZerosLike 算子与 aclnnInplaceZero 接口使用指南下一篇json-render 技能指南Remotion 字幕处理全流程 —— Caption 数据模型、Whisper 转录、TikTok 风格展示与 .srt 导入创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考