• 希望你能勇敢追求自由,去成为海贼王。

2021年8月18日星期三

RIME输入法的字库自动同步(windows和安卓)

     对于商业软件,我有种天然的抗拒,虽然易用,但同时也出卖了隐私。隐私的话题,可以霸道的说你没做坏事,怕什么监控,对于这种口径,可以单独开文,从逻辑上详细的辩驳,但是不是本文的主旨。

    我目前选用的开源输入法是RIME。具体下来就是,windows的小狼毫和android的同文,其他平台Linux,MAC和IOS也有,都是一个框架下的。因为我没有Linux桌面版和MAC,IPAD也坏了,目前只处理了windows和安卓。

第一部分,rime目录简介

    简单介绍下rime,它只是一个框架,需要再安装输入法,字典和皮肤,所有都是yaml文件,还可以通过custom.yaml文件打补丁。额外的,繁简转换opencc。

  • 输入法包括键位,字库统计等,以schema.yaml结尾。
  • 皮肤包括候选词,悬浮窗,背景等。
  • 字典就是自带的或者第三方的字库,以dict.yaml结尾。
    有两个目录比较重要:
  • 配置目录,就是放上面说的输入法,字典,皮肤,放置的位置。
  • 同步目录,不同的终端可以把自己的配置文件以及字库放到该目录下面。

第二部分,输入方案的选择

    rime只是一个框架,所有内容都由配置来定义,准确来讲是选择输入方案,为了简单,下文写输入法。需要说明的一点,字库要同步,各个终端的输入法必须一致才行,不然需要自己来配置用同样的dict字库或者user.txt,暂时没有时间自己来具体研究怎么样来定义一个输入法,也不知道不同输入方式取用同一个字库如何来配置,先就简。
    windows上面使用默认自带的输入法luna_pinyin,这个还是比较完善的。
    安卓上面是需要自己安装的,
  • 我比较喜欢九宫格拼音,但是看了下trime里面的issues,目前这个的支持需要librimecore,估计短期内不能内置支持。找了下第三方,有个clover四叶草的方案,安装以后确实可以用,但是选词左右拉的箭头不太舒服,手动修改为浮动窗口,稍微好一些,但是windows上面也安装clover并启用以后,无法同步,安卓改用26键的clover也无法同步。
  • 安装luna_pinyin,安装以后trime里面选择报错,无default.yaml,trime.yaml等文件,于是把clover四叶草的文件也放进去,用该方案里面的“同文风增强版.trime.yaml"+luna_pinyin_simp.schema.yaml等,启动成功,测试同步也成功。

第三部分,手动同步

    第一部分里面说的目录里面,同步基本就是同步目录和配置目录两个目录之间的关系。
    同步方式是单向同步,就是:
  •     配置等从配置目录单向往同步目录下面本终端的同步目录下同步,
  •     字库双向同步,从同步目录双向往配置目录同步。
    上面提到的本终端同步目录的名字具体由installation.yaml里面来定义。
    要进行手动同步,就是要:
  • 把本终端的同步目录上传到云上面,
  • 然后各个终端从云上面把其他终端的配置拉下来,
  • 最后本地进行同步操作。
    这里面涉及的几个操作:
    目录上传或者下载,这个我使用的方案是rclone,可以自己编译,windows和安卓上面都有已编译好的,下载配置,然后使用即可,注意一个方向是上传,一个方向是下载。
    本地同步操作,不同的操作系统命令不太一样,经过摸索,
  •     windows:WeaselDeployer /sync
  •     安卓:am broadcast -a com.osfans.trime.sync
    这样,整体可以针对不同的终端写一下脚本,执行脚本就可以手动同步。

第四部分,自动同步

    写到这里,后面其实就比较简单了,windows比较简单,直接用任务计划程序设定定时执行脚本就可以了。
    重点说下安卓,因为安卓的定时任务支持不完全,需要考虑,手机重启等情况。同时android使用rclone,因为用户和环境变量的问题,需要手动指定rclone.conf配置文件,这些都是需要摸索的。
    这里我尝试了几个方案:

    方案一,使用magisk和DJS。

    DJS的文档很不完整,比较难以使用,基本格式是“HHMM TASK”。我习惯是把脚本执行的日志重定向输出到一个文件里面。检查日志发现这个am broadcast会有问题,会报错”failure calling service activity:failed transaction"。 怀疑是任务重定向有问题,把脚本拆开,目录上传,下载,以及am这个分别做成一个定时任务。调试多了,DJS直接不执行了,直接删除该模块了。

    方案二,使用busybox和crontab。

    busybox也可以用magisk安装。然后把相关的rclone二进制执行文件和rclone.conf放到/data/adb/modules下面,自己建一个目录。这里面的主要难点有两个:
    第一个是crontab用root用户执行创建任务,需要创建/var/spool/cron/crontabs目录,这个是在根目录了,需要手机支持adb root,然后remount可读写,现在android版本都是system as root, 直接操作system分区风险还是很大的。我的小米6装的是microg版本的lineage,remount之后创建该目录,测试成功了。但是我的一加8T装的正式版lineageos,结果重启直接出问题,网络模块直接挂了。而且OTA升级,强制刷新system,这个创建的目录以及创建任务后生成的文件也没了。
    第二个是crond进程的开机自动启动。我的方法是在/data/adb/service.d下面写一个脚本,仿照vanced的写法,监控手机启动完成以后,再执行crond,这里可以贴一下这个文件的内容:
#!/system/bin/sh
while [ "$(getprop sys.boot_completed | tr -d '\r')" != "1" ]; do sleep 1; done
sleep 1
/system/xbin/crond

    方案三,直接用termux和termux:boot

    这个方案最简单,也是在Fdroid上面搜索发现还有这么一个插件。直接在termux上面安装cronie,然后配置好定时任务,用termux:boot创建启动任务,获取wakelock,测试成功。
    

没有评论:

发表评论