Trime同文输入法
  R3jekIqJDwNw 2023年11月02日 60 0


一、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 -> 系统 -> 语言和输入法 -> 虚拟键盘 -> 同文输入法 -> 无法打开同文输入法的设置

Trime同文输入法_输入法

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...

选择方案时出现如下提示:

Trime同文输入法_输入法_02

问题原因:缺少默认方案配置文件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(可为空)放入【配置管理->共享文件夹】指定路径

Trime同文输入法_rime_03

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 侯选栏为空

部署某方案后,调出输入法发现侯选栏为空,无法正常给出候选词,选择字母直接上屏

Trime同文输入法_rime_04

问题原因: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
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

R3jekIqJDwNw