一、trime同文输入法介绍
trime同文输入法是基于rime输入法引擎面向Android平台的一款开源高度可定制化输入法应用,提到trime就不得不先了解下rime。
1.1 rime与trime
rime并不是一个输入法应用,而是经过巧妙设计能够满足丰富定制化的输入法引擎。
大约是2009年由佛振大佬发起项目,起初是在linux平台开发使用,配套的前端为ibus-rime(中州韵),后经多人共同开发维护,逐渐支持多平台,Rime前端汇总:
Frontend | Os | Code | Download |
---|---|---|---|
Weasel (小狼毫) | Windows | rime/weasel | link |
rime-gits | Windows | lotem/rime-gits | link |
PIME | Windows | EasyIME/PIME | link |
Squirrel (鼠须管) | macOS | rime/squirrel | link |
XIME | macOS | stackia/XIMA | link |
iRime | iOS | jimmy54/iRime | App Store |
ibus-rime | Linux | rime/ibus-rime | link |
fcitx-rime | Linux | fcitx/fcitx-rime | link |
Trime (同文) | Android | osfans/trime | link |
其核心算法库都为librime,用来维护输入方案和词典文件的数据集,是输入法软件的后端。
由此trime作为Android平台同文输入法的前端,librime作为同文输入法的后端。
有兴趣的同学可以阅读佛振大佬的专访:一位匠人的中州韵——专访Rime输入法作者佛振(图灵访谈)
1.2 trime的特点
如上所述,trime等其他基于rime输入引擎的输入法,其核心算法是通用的,因此trime的特点特长就是rime的特点,粗略总结如下:
- 支持用户自定义输入法规则。rime设计的初衷之一是保护方言,一些开发者基于rime创作出如吴语上海话、苏州话、古汉语、粤语等拼音输入法,当然也可以设计外语输入法,如泰语、韩语、日语等。
- 客制化选项丰富,rime配置文件格式为yaml,允许对输入法的键盘布局,键盘背景、字体颜色、字符侯选/联想等等功能进行自定义配置。
- 支持字典词库的定制化,词典能大大提高输入法的输入效率。上面所提的方言输入法、外语输入法正是因为词库能定制,才有用武之地。
具体trime的这些特点怎样体现,如何配置,请见第三、第四章节。
二、trime源码下载及编译
2.1 trime源码下载
github trime项目地址:https://github.com/osfans/trime
(这里我是在wsl linux环境下载的代码,也可以通过github客户端下载)
下载步骤如下:
#planA:
$git clone --recursive https://github.com/osfans/trime.git
#如果出现如下报错,因为墙的原因导致的clone失败,请尝试planB
Cloning into 'trime'...
fatal: unable to access 'https://github.com/osfans/trime.git/': Failed to connect to github.com port 443: Connection refused
#planB,使用ghproxy.com代理
#Step1,
$git clone https://ghproxy.com/https://github.com/osfans/trime.git
Cloning into 'trime'...
remote: Enumerating objects: 15640, done.
remote: Counting objects: 100% (1379/1379), done.
remote: Compressing objects: 100% (455/455), done.
remote: Total 15640 (delta 710), reused 1203 (delta 606), pack-reused 14261
Receiving objects: 100% (15640/15640), 27.65 MiB | 1.65 MiB/s, done.
Resolving deltas: 100% (8094/8094), done.
Checking out files: 100% (260/260), done.
#Step2,配置trime子模块url
#修改trime/.gitmodules,每条url前面加上https://ghproxy.com/
[submodule "OpenCC"]
path = app/src/main/jni/OpenCC
url = https://ghproxy.com/https://github.com/BYVoid/OpenCC.git
[submodule "snappy"]
path = app/src/main/jni/snappy
url = https://ghproxy.com/https://github.com/google/snappy.git
[submodule "boost"]
path = app/src/main/jni/boost
url = https://ghproxy.com/https://github.com/boostorg/boost.git
[submodule "librime"]
path = app/src/main/jni/librime
url = https://ghproxy.com/https://github.com/rime/librime.git
ignore = dirty
[submodule "libiconv"]
path = app/src/main/jni/libiconv
url = https://ghproxy.com/https://github.com/osfans/libiconv-gnu.git
[submodule "librime-lua"]
path = app/src/main/jni/librime-lua
url = https://ghproxy.com/https://github.com/hchunhui/librime-lua
ignore = dirty
[submodule "librime-lua-deps"]
path = app/src/main/jni/librime-lua-deps
url = https://ghproxy.com/https://github.com/hchunhui/librime-lua
branch = thirdparty
[submodule "librime-octagram"]
path = app/src/main/jni/librime-octagram
url = https://ghproxy.com/https://github.com/lotem/librime-octagram.git
[submodule "capnproto"]
path = app/src/main/jni/capnproto
url = https://ghproxy.com/https://github.com/capnproto/capnproto.git
[submodule "librime-charcode"]
path = app/src/main/jni/librime-charcode
url = https://ghproxy.com/https://github.com/rime/librime-charcode
#Step3
$cd trime
$git submodule update --init --recursive
#可能出现如下报错 (未报错则跳过Step4):
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/glog'...
fatal: unable to access 'https://github.com/google/glog.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/google/glog.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/glog' failed
Failed to clone 'deps/glog'. Retry scheduled
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/googletest'...
fatal: unable to access 'https://github.com/google/googletest.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/google/googletest.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/googletest' failed
Failed to clone 'deps/googletest'. Retry scheduled
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/leveldb'...
fatal: unable to access 'https://github.com/google/leveldb.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/google/leveldb.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/leveldb' failed
Failed to clone 'deps/leveldb'. Retry scheduled
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/marisa-trie'...
fatal: unable to access 'https://github.com/s-yata/marisa-trie.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/s-yata/marisa-trie.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/marisa-trie' failed
Failed to clone 'deps/marisa-trie'. Retry scheduled
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/opencc'...
fatal: unable to access 'https://github.com/BYVoid/OpenCC.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/BYVoid/OpenCC.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/opencc' failed
Failed to clone 'deps/opencc'. Retry scheduled
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/yaml-cpp'...
fatal: unable to access 'https://github.com/jbeder/yaml-cpp.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/jbeder/yaml-cpp.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/yaml-cpp' failed
Failed to clone 'deps/yaml-cpp'. Retry scheduled
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/glog'...
fatal: unable to access 'https://github.com/google/glog.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/google/glog.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/librime/deps/glog' failed
Failed to clone 'deps/glog' a second time, aborting
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/snappy/third_party/benchmark'...
fatal: unable to access 'https://github.com/google/benchmark.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/google/benchmark.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/snappy/third_party/benchmark' failed
Failed to clone 'third_party/benchmark'. Retry scheduled
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/snappy/third_party/googletest'...
fatal: unable to access 'https://github.com/google/googletest.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/google/googletest.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/snappy/third_party/googletest' failed
Failed to clone 'third_party/googletest'. Retry scheduled
Cloning into '/mnt/g/project/github/trime/app/src/main/jni/snappy/third_party/benchmark'...
fatal: unable to access 'https://github.com/google/benchmark.git/': Failed to connect to github.com port 443: Connection refused
fatal: clone of 'https://github.com/google/benchmark.git' into submodule path '/mnt/g/project/github/trime/app/src/main/jni/snappy/third_party/benchmark' failed
Failed to clone 'third_party/benchmark' a second time, aborting
Failed to recurse into submodule path 'app/src/main/jni/librime'
Failed to recurse into submodule path 'app/src/main/jni/snappy'
#Step4 处理报错信息
#根据上述报错信息,修改相应子模块.gitmodules,每条url前面加上https://ghproxy.com/
#上述报错修改文件有:
#trime/app/src/main/jni/librime/.gitmodules
#trime/app/src/main/jni/snappy/.gitmodules
#trime/app/src/main/jni/librime/deps/leveldb/.gitmodules (第二次编译报错后修改)
#例如,trime/app/src/main/jni/snappy/.gitmodules修改后如下:
[submodule "third_party/googletest"]
path = third_party/googletest
url = https://ghproxy.com/https://github.com/google/googletest.git
[submodule "third_party/benchmark"]
path = third_party/benchmark
url = https://ghproxy.com/https://github.com/google/benchmark
#更新.gitmodules配置并重新下载代码
$git submodule sync --recursive && git submodule update --init --recursive
#未报错则代码下载成功~(由于trime导入了众多第三方库,使得整个项目(V3.2.8)达到了1.97G。)
Step 5,修改trime源码文件格式为unix
由于下来的代码文件格式不统一,在linux编译时会导致奇奇怪怪的报错,保险起见将整个项目文件统一改为unix格式
trime$for x in $(find . -type f);do sudo dos2unix $x $x;done
注意
:由于trime项目(V3.2.8)有1.97G,因此dos2unix会花点时间,请耐心等待~
2.2 trime编译
1、Android Studio 导入trime
File -> Open -> 选择trime
2、根据trime/app/build.gradle配置SDK,NDK,Cmake
android {
compileSdkVersion 31
ndkVersion "24.0.8215888" #在SDK Manager安装NDK 24.0.8
...
targetSdkVersion 29 #SDK Manager 安装SDK 29
...
externalNativeBuild {
cmake {
version "3.22.1" #SDK Manager 安装Cmake3.22.1
}
}
3、无其他报错则选择run,进行编译
若一切顺利,编译生成的apk路径位于:trime/app/build/intermediates/apk/debug/trime-3.2.9-arm64-v8a-debug.apk
并在devices中安装上了【同文输入法】;若有报错,参考 5.1编译报错小结。
三、trime项目架构介绍
3.1 trime项目源码结构
⌵ trime #同文输入法根目录
⌵ app #android 及jni代码
| ⌵ build #编译生成文件
| | ⌵ intermediates/apk/debug #编译生成的apk路径
| | trime-3.2.9-arm64-v8a-debug.apk #编译出的apk
| ⌵ src/main #trime android 前端源码
| | ⌵ assets/rime #默认配置文件夹
| | ⌵ backgrounds #存放背景图片文件夹,用于定制化背景样式
| | | ⌵ myBcakgrounds #定制化背景图片存放路径,在trime.yaml -> background_folder: myBackgrounds配置
| | | background1.png #背景图片,可在trime.yaml->key_back_color、hilited_key_back_color等字段配置
| | | background2.png
| | | ...
| | ⌵ fonts #存放字体文件夹
| | | front1.ttf #front1.ttf字符文件,在trime.yaml->candidate_font、comment_font等字段配置
| | | front2.ttf
| | | ...
| | opencc #简繁转换组件
| | tongwenfeng.trime.yaml #定制化主题文件
| | trime.yaml #默认主题文件,可配置键盘布局,字体,颜色,间距等等键盘UI内容。
| ⌵ java/com/osfans/trime #trime android 前端java核心代码
| | core
| | data
| | ime
| | ui
| | util
| | TrimeApplication.kt
| | TrimeImeService.kt
| ⌵ jni #trime jni文件夹,各类库
| | boost
| | capnproto
| | cmake
| | libiconv
| | librime
| | librime_jni
| | librime-charcode
| | librime-lua
| | librime-lua-deps
| | librime-octagram
| | OpenCC
| | snappy
| | CMakeLists.txt
| res
| AndroidManifest.xml
| ic_app_icon-playstore.png
arwork
build
gradle/wrapper
script
3.2 设备中trime文件架构介绍
⌵ sdcard/rime
⌵ build
|
default.yaml
default.custom.yaml
luna_pinyin.dict.yaml
luna_pinyin.schema.yaml
luna_pinyin.userdb
korean.dict.yaml
korean.schema.yaml
korean.userdb
...
installation.yaml
opencc
trime.yaml
trime.custom.yaml
user.yaml
四、trime定制
4.1 参考资料
Link | Content |
---|---|
Rime官网 | rime介绍 |
Rime前端汇总 | Windows、macOs、iOs、Linux、Android前端代码及应用下载地址 |
Rime输入方案设计书 | rime工作原理、设计思想、数据文件作用及分布、组件工作流程、patch定制 |
Rime的独门绝技 | 拼写运算、按键响应自定义、对输入处理流程的建模 |
配置同文输入法–简易索引 | 文件说明 |
Rime贴吧 | rime交流讨论 |
致第一次安装 RIME 的你之修订版 | 繁简转换、字体颜色配置、快捷键修改、标点符号定制等 |
佛振教你写 Rime 输入方案之辅助码的作法 | 辅助码配置 |
定制指南 | 定制候选页、标点符号、方案、组合键、字体字号、配色方案、模糊音、反查等 |
Schema.yaml详解 | schema.yaml输入方案的开关、输入引擎等细项配置、dict.yaml词典配置 |
trimer小知识 Yaml文件开头注释是什么意思? 配置文件中的一些yaml语法 | yaml开头注释 yaml介绍、数据表示/引用方式、补丁注意事项等 |
配置同文输入法–trime.yaml详解 | trime.yaml 中style、字体、尺寸、悬浮窗口、颜色等 |
案例参考 五笔双键配置案例详解(一) 准备篇 五笔双键配置案例详解(二) 添加一个输入方案 五笔双键配置案例详解(三) 用模糊音实现双键转换 五笔双键配置案例详解(四) 实现手机上的双键键盘 | 案例五笔双拼配置教程 |
正则表达式 Perl 正则表达式语法 正则表达式(菜鸟教程) 正则表达式 | 正则表达式语法及使用介绍 |
4.2 输入方案客制化配置
//待整理后贴上
4.3 词典客制化配置
4.3.1 dict.yaml文件规范
- 词典文件通常与输入方案对应,一个输入方案对应至少一个词典
- 词典文件通常与方案前缀保持一致,后缀为.dict.yaml
4.4 主题客制化配置
//待整理后贴上
4.2、预置默认输入方案、词典等
将需要预置的配置文件放入trime/app/src/main/assets/rime
//补充完善中…
五、异常处理
5.1编译报错
- 5.1.1 trime源码导入AndroidStudio报错,Plugin [id: ‘com.android.application’, version: ‘7.2.2’, apply: false] was not found
报错信息:
Build file 'G:\project\github\trime\build.gradle' line: 17
Plugin [id: 'com.android.application', version: '7.2.2', apply: false] was not found in any of the following sources:
* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Exception is:
org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'com.android.application', version: '7.2.2', apply: false] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'com.android.application:com.android.application.gradle.plugin:7.2.2')
Searched in the following repositories:
Gradle Central Plugin Repository
Google
MavenRepo <97 internal lines>
at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:116)
at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:42) <82 internal lines>
问题原因:所配置的gradle版本在本地配置的gradle仓库中未找到。
解决方案:
修改settings.gradle
pluginManagement {
repositories {
+ maven { url "https://jitpack.io" }
+ maven { url 'https://maven.aliyun.com/repository/releases' }
+ maven { url 'https://maven.aliyun.com/repository/jcenter' }
+ maven { url 'https://maven.aliyun.com/repository/google' }
+ maven { url 'https://maven.aliyun.com/repository/central' }
+ maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
+ maven { url 'https://maven.aliyun.com/repository/public' }
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
+ maven { url "https://jitpack.io" }
+ maven { url 'https://maven.aliyun.com/repository/releases' }
+ maven { url 'https://maven.aliyun.com/repository/jcenter' }
+ maven { url 'https://maven.aliyun.com/repository/google' }
+ maven { url 'https://maven.aliyun.com/repository/central' }
+ maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
+ maven { url 'https://maven.aliyun.com/repository/public' }
google()
mavenCentral()
}
}
(参考:Gradle问题篇】Plugin [id: ‘com.android.application‘, version: ‘7.x.x‘, apply: false] was not found i…)
- 5.1.2 CMake ‘3.22.1’ was not found
[CXX1300] CMake '3.22.1' was not found in SDK, PATH, or by cmake.dir property.
问题原因:未找到Cmake 3.22.1
解决方案:在Android Studio -> File -> Settings ->System Settings -> Android SDK -> SDK Tools中下载安装相应版本的Cmake组件。如果行不通可在Cmake官网下载后手动安装和配置。
Cmake版本定义在trime/app/build.gradle
externalNativeBuild {
cmake {
version "3.22.1"
}
}
(参考:Android Studio Cmake升级至最新版本)
- 5.1.3 C/C++: ld: error: undefined symbol: rime_require_module_octagram()
[320/320] Linking CXX shared library G:\project\github\trime\app\build\intermediates\cxx\Debug\383b5c5f\obj\arm64-v8a\librime_jni.so
FAILED: G:/project/github/trime/app/build/intermediates/cxx/Debug/383b5c5f/obj/arm64-v8a/librime_jni.so
cmd.exe /C "cd . && D:\sdk\ndk\24.0.8215888\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android21 --sysroot=D:/sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -fexceptions -frtti -stdlib=libc++ -g -fno-limit-debug-info -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Qunused-arguments -Wl,--no-undefined -shared -Wl,-soname,librime_jni.so -o G:\project\github\trime\app\build\intermediates\cxx\Debug\383b5c5f\obj\arm64-v8a\librime_jni.so librime_jni/CMakeFiles/rime_jni.dir/key_table.cc.o librime_jni/CMakeFiles/rime_jni.dir/levers.cc.o librime_jni/CMakeFiles/rime_jni.dir/opencc.cc.o librime_jni/CMakeFiles/rime_jni.dir/rime_jni.cc.o librime/lib/librime.a -llog OpenCC/src/libopencc.a boost/libs/filesystem/libboost_filesystem.a boost/libs/iostreams/libboost_iostreams.a D:/sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/21/libz.so boost/libs/locale/libboost_locale.a libiconv.a boost/libs/random/libboost_random.a boost/libs/serialization/libboost_serialization.a boost/libs/thread/libboost_thread.a boost/libs/date_time/libboost_date_time.a boost/libs/exception/libboost_exception.a boost/libs/container/libboost_container.a boost/libs/atomic/libboost_atomic.a boost/libs/chrono/libboost_chrono.a librime/deps/yaml-cpp/libyaml-cppd.a librime/deps/leveldb/libleveldb.a snappy/libsnappy.a -pthread OpenCC/deps/marisa-0.2.6/libmarisa.a -static-libstdc++ -latomic -lm && cd ."
ld: error: undefined symbol: rime_require_module_lua()
>>> referenced by rime_jni.cc:9 (G:/project/github/trime/app/src/main/jni/librime_jni\rime_jni.cc:9)
>>> librime_jni/CMakeFiles/rime_jni.dir/rime_jni.cc.o:(declare_librime_module_dependencies())
ld: error: undefined symbol: rime_require_module_charcode()
>>> referenced by rime_jni.cc:10 (G:/project/github/trime/app/src/main/jni/librime_jni\rime_jni.cc:10)
>>> librime_jni/CMakeFiles/rime_jni.dir/rime_jni.cc.o:(declare_librime_module_dependencies())
ld: error: undefined symbol: rime_require_module_octagram()
>>> referenced by rime_jni.cc:11 (G:/project/github/trime/app/src/main/jni/librime_jni\rime_jni.cc:11)
>>> librime_jni/CMakeFiles/rime_jni.dir/rime_jni.cc.o:(declare_librime_module_dependencies())
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
问题原因:rime_require_module_lua()、rime_require_module_charcode()、rime_require_module_octagram()未实现。
解决方案:注释该无效引用
trime/app/src/main/jni/librime_jni/rime_jni.cc
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM* jvm, void* reserved)
{
GlobalRef = new GlobalRefSingleton(jvm);
+// declare_librime_module_dependencies();
return JNI_VERSION_1_6;
}
5.2运行异常
5.2.1 应用安装失败,Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]
问题原因:无法安装debug apk
解决方案:adb install -t xxx.apk
5.2.2 无法从系统设置中打开同文输入法设置
Settings -> 系统 -> 语言和输入法 -> 虚拟键盘 -> 同文输入法 -> 无法打开同文输入法的设置
02-15 04:07:25.952 1639 2314 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cmp=com.osfans.trime/.settings.PrefMainActivity} from uid 1000
02-15 04:07:25.958 17765 17765 D InputMethodPreference: IME's Settings Activity Not Found
02-15 04:07:25.958 17765 17765 D InputMethodPreference: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.osfans.trime/com.osfans.trime.settings.PrefMainActivity}; have you declared this activity in your AndroidManifest.xml?
02-15 04:07:25.958 17765 17765 D InputMethodPreference: at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2062)
问题原因:trime settingsActivity指向旧Activity,需更新
解决方案:
trime/app/src/main/res/xml/method.xml
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:supportsSwitchingToNextInputMethod="true"
- android:settingsActivity="com.osfans.trime.settings.PrefMainActivity">
+ android:settingsActivity="com.osfans.trime.ui.main.PrefMainActivity">
<!-- Add default system subtype so we can properly set the icon and label -->
<subtype android:label="@string/trime_app_slogan"
android:name="@string/trime_app_name"
android:icon="@mipmap/ic_app_icon"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable" />
</input-method>
5.2.3 选择方案异常:请在用户文件夹中放入default.yaml…
选择方案时出现如下提示:
问题原因:缺少默认方案配置文件default.yaml 或default.custom.yaml
。
trinket:/storage/emulated/0/rime # ls -al
total 264
drwxrwx--x 4 root sdcard_rw 3488 2022-02-14 23:01 .
drwxrwx--x 13 root sdcard_rw 3488 2022-02-14 23:01 ..
drwxrwx--x 2 root sdcard_rw 3488 2022-02-14 23:01 build
-rw-rw---- 1 root sdcard_rw 0 2022-02-14 23:01 default.custom.yaml
-rw-rw---- 1 root sdcard_rw 116 2022-02-14 23:01 installation.yaml
drwxrwx--x 2 root sdcard_rw 3488 2022-02-14 23:09 opencc
-rw-rw---- 1 root sdcard_rw 184697 2022-02-14 23:01 tongwenfeng.trime.yaml
-rw-rw---- 1 root sdcard_rw 67085 2022-02-14 23:01 trime.yaml
解决方案:
将default.yaml 、default.custom.yaml(可为空)放入【配置管理->共享文件夹】指定路径
default.yaml位于:trime\app\src\main\jni\librime\data\minimal\default.yaml
default.custom.yaml位于trime\app\src\main\assets\rime\default.custom.yaml或自己创建空文件
再次选择方案则正常
5.2.4 侯选栏为空
部署某方案后,调出输入法发现侯选栏为空,无法正常给出候选词,选择字母直接上屏
问题原因:punctuator
错误配置为symbols
解决方案:将punctuator配置为default
punctuator:
import_preset: default
5.3配置不生效
- 5.3.1 xxx.dict.yaml词典添加或修改后不生效
由于yaml对于格式要求严格,这种情况需对比正常文件检查修改内容格式是否正确。 - 5.3.2 修改xxx.yaml文件后未生效
删除trime/app/build文件夹后再尝试 - 5.3.3 librime无日志打印输出
trime/app/src/main/jni/CMakeLists.txt 默认关闭了ENABLE_LOGGING宏,但打开后未正确include glog/logging.h,会编译报错。
option(ENABLE_LOGGING "" OFF)
trime/app/src/main/jni/librime/src/rime/common.h
#ifdef RIME_ENABLE_LOGGING //如果定义了RIME_ENABLE_LOGGING则采用glog打印
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <glog/logging.h>
#else
#include "no_logging.h" //否则关闭log,默认走这个case
#endif // RIME_ENABLE_LOGGING
trime/app/src/main/jni/librime/src/rime/no_logging.h
#define RIME_NO_LOG true ? (void) 0 : rime::Voidify() & rime::VoidLogger().stream() //默认关闭log,改为false也无打印
#define LOG(severity) RIME_NO_LOG
#define VLOG(verboselevel) RIME_NO_LOG
#define LOG_IF(severity, condition) RIME_NO_LOG
#define LOG_EVERY_N(severity, n) RIME_NO_LOG
#define LOG_IF_EVERY_N(severity, condition, n) RIME_NO_LOG
#define LOG_ASSERT(condition) RIME_NO_LOG
在common.h中使用 android/log.h输出日志打印
trime/app/src/main/jni/librime/src/rime/common.h
#ifdef RIME_ENABLE_LOGGING
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <glog/logging.h>
#else
#include "no_logging.h"
+//#define TAG "librime"
+#ifdef ANDROID
+#include <android/log.h>
+#define ALOGE(fmt, ...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##__VA_ARGS__)
+#define ALOGI(fmt, ...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##__VA_ARGS__)
+#else
+#define ALOGE printf
+#define ALOGI printf
+#endif
#endif // RIME_ENABLE_LOGGING
添加打印
trime/app/src/main/jni/librime/src/rime/engine.cc
+#define TAG "engine"
.....
bool ConcreteEngine::ProcessKey(const KeyEvent& key_event) {
DLOG(INFO) << "process key: " << key_event;
+ ALOGI("ProcessKey keycode=%d", key_event.keycode());
ProcessResult ret = kNoop;
输出日志:
engine : RimeProcessKey keycode=113