Trime同文输入法


一、trime同文输入法介绍

trime同文输入法是基于rime输入法引擎面向Android平台的一款开源高度可定制化输入法应用,提到trime就不得不先了解下rime。

1.1 rime与trime

rime并不是一个输入法应用,而是经过巧妙设计能够满足丰富定制化的输入法引擎。
大约是2009年由佛振大佬发起项目,起初是在linux平台开发使用,配套的前端为ibus-rime(中州韵),后经多人共同开发维护,逐渐支持多平台,Rime前端汇总

FrontendOsCodeDownload
Weasel (小狼毫)Windowsrime/weasellink
rime-gitsWindowslotem/rime-gitslink
PIMEWindowsEasyIME/PIMElink
Squirrel (鼠须管)macOSrime/squirrellink
XIMEmacOSstackia/XIMAlink
iRimeiOSjimmy54/iRimeApp Store
ibus-rimeLinuxrime/ibus-rimelink
fcitx-rimeLinuxfcitx/fcitx-rimelink
Trime (同文)Androidosfans/trimelink

其核心算法库都为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 参考资料

LinkContent
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
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值