技术引领创新,用“芯”构建生态,第一期龙芯生态论坛于2021年3月12日(周五)盛大开讲!龙芯生态论坛作为龙芯生态建设的重要技术交流窗口,将汇聚龙芯资深技术专家及行业生态伙伴精英,持续开展行业建设成果及技术分享活动,为繁荣龙芯生态、推动技术创新,贡献力量。

作为生态资源建设中的重要内容,龙芯架构下的应用迁移备受关注。目前基于龙芯架构,已构建起了完整的适配体系,内容涵盖操作系统、中间件及各类应用软件,输入法工具作为常用软件也成为龙芯架构应用迁移适配的重要内容。享有“国民输入法”美誉、采用经典C/C++语言研发的搜狗输入法,目前已完成龙芯架构下的迁移适配,正服务于党政企业、高等院校及众多终端用户。

本次活动邀请龙芯中科资深工程师韩广以及搜狗输入法资深开发工程师王宇航两位老师,围绕龙芯架构下C/C++类应用迁移技术基础及搜狗输入法企业级应用迁移案例,从理论到实践,分享技术经验,剖析迁移过程中的技术问题,带领大家一窥应用迁移技术全貌。

以下内容为活动速记

分享主题:搜狗输入法在龙芯平台上的适配与应用

分享嘉宾:搜狗资深高级开发工程师 王宇航

在这里插入图片描述

目前就职于搜狗输入法事业部。从事跨平台搜狗输入法的研发工作,喜好各种跨平台技术,致力于为输入法用户提供极致的输入体验。

正文如下

1、项目背景

本次分享的主题的是搜狗输入法在龙芯平台上的适配与应用,接下来主要从以下几个方面展开:项目的背景和介绍,目前的适配成果,迁移路径和后续规划.

干货应用迁移|搜狗输入法在龙芯平台上的适配与应用

搜狗成立于2003年,搜狗月活跃用户数仅次于BAT,是中国用户规模第四大互联网公司。搜狗成立至今经历6次突破,不断的成长,成长的背后是不断突破创新的追求。在中国,提到输入法首先会想到搜狗输入法,搜狗输入法在2006年一经发布就迅速占领市场,目前搜狗输入法在APP榜单排名第三,活跃用户8.2亿,市场份额占到86%。

干货应用迁移|搜狗输入法在龙芯平台上的适配与应用

搜狗输入法秉承为用户提供极致的输入体验,每一次更新都会给用户带来不同的输入体验。2014年发布linux输入法,后面的迭代速度也是不断的加快。2020年1月搜狗输入法推出全新的企业版1.0,突破了只适配传统的x86,同时适配的还有arm以及mips多架构,并且支持五笔。

2、适配成果

搜狗输入法在龙芯平台上的适配成果,目前搜狗输入法对主流的硬环境以及核心的输入场景已达到100%的适配。

干货应用迁移|搜狗输入法在龙芯平台上的适配与应用

  • 在操作系统方面:信创领域,占主流的UOS以及麒麟操作系统完全适配。
  • Cpu架构方面,龙芯架构已经完全适配
  • 在linux发行版中的两个主流包管理器:rpm和deb这两种安装包的格式,搜狗输入法已经完全支持
  • 从输入法功能维度看,基础输入的拼音输入,五笔输入,英文输入,小语种输入100%支持
  • 扩展输入方面:虚拟键盘输入语音输入,以及辅助功能的属性设置已经迁移完成实现100%支持

3、搜狗输入法迁移路径

干货应用迁移|搜狗输入法在龙芯平台上的适配与应用

  • 迁移准则:迁移速度快,迁移效果好.
  • 前期:对搜狗输入法对平台架构进行梳理和设计.
  • 中期:三个阶段:编译,调试和部署,部署成功就可以成功运行.
  • 后期:运行成功不意味着迁移成功,搜狗输入法秉承为用户提供极致的输入体验。在完成部署后,需要对输入法的流畅度,性能做进一步的验证,调试,测试,调优等,从而达到最好的效果。

下面将从迁移前期、中期、后期三个阶段进行介绍。

4、 迁移前期遇到的问题&解决方案

迁移前期,对输入法软件进行了分层设计,抽象出与平台相关的功能,对上层屏蔽平台差异,实现输入法原有逻辑的最大复用。

此前,搜狗输入法只运行在Windows系统上,符合TSF输入法框架,而龙芯架构只运行Linux系统,因此搜狗输入法需要对Linux系统进行适配并接入Linux系统主流的Fctix输入法框架。为了适配全新的Fctix框架,并达到“速度快、效果好”的迁移目标,重新对输入法软件进行了架构设计,抽象出与平台相关的Platform层,对上层屏蔽了平台差异,为最大程度地复用现有稳定代码提供了技术基础。

下面对新的输入法软件架构进行说明。如下图。

干货应用迁移|搜狗输入法在龙芯平台上的适配与应用

  1. Platform层:集中抽象实现了平台相关的部分,包括UI绘制、消息循环、系统信息等功能,屏蔽了各平台的差异,为上层提供了统一的操作接口。
  2. Foundation层:该层为基础功能层,为上层提供了基础通用功能及UI元素。本层分为CommonLib与UILib两部分,其中通用库为基础功能库,主要实现ini及XML解析、加解密、容器、锁、认证等基础功能;UI库为UI提供了基础UI元素,包括图片、字体、画布、定时器、窗口及各类控件。
  3. 输入法逻辑层:由于底层已经处理了平台差异,因此本层大量复用了搜狗输入法原有稳定运行的输入法逻辑。本层分为输入逻辑层和UI逻辑层两部分,输入逻辑层包括语音输入、物理键盘输入、手写输入、虚拟键盘输入、小语种及多语言输入等输入逻辑;UI逻辑层主要包括搜狗输入法的UI的窗口界面,包括写作窗口、软件盘、状态栏等。
  4. SDK层:作为输入法和系统输入法框架的桥梁,SDK层屏蔽了不同输入法框架间的差异,为输入法的逻辑层提供了稳定统一的接口,实现了对现有逻辑的高复用,为又好又快地迁移提供了坚实的基础。

下面将介绍的是Linux平台上,搜狗输入法和Fctix输入法框架以及各应用之间的进程关系。见下图。

干货应用迁移|搜狗输入法在龙芯平台上的适配与应用

图片图右下方为Linux中Fctix输入法框架,该框架为C/S架构,是Linux系统中独立运行的进程。

图片左半部分为Linux中运行的各种应用程序,包括GTK、Qt及X Window应用程序。各应用程序与Fctix输入法框架之间通过XIM协议进行通信,例如键盘按键,Fcitx收到键盘按键消息后,会按照当前选中的输入法,调用相应的输入法插件,因此在Linux系统中搜狗输入法实现了一个Fctix框架的插件运行在Fctix输入法框架中。

搜狗输入法插件被Fcitx调用后,通过消息队列(MessageQueue)进行进程间调用,调用到搜狗输入法的服务端(service),消息队列传输的具体数据使用ProtoBuf进行序列化与反序列化,并实现了数据打包后的信息。输入法的service被调用后会将数据传递给搜狗输入法的SDK,按照SDK中包含的各种输入逻辑进行处理,处理结果再通过消息队列(MessageQueue)返回给Fctix插件,Fcitx再通过XIM协议返回给各应用程序,完成输入流程。

完成整体的框架设计之后,就可以开展实际的迁移工作了,随之也进入到了迁移中期。迁移中期,在编译、调试、部署不同阶段也遇到了不同的问题,主要包括开发环境的构建比较复杂、编码调试工具使用不太方便、缺少软件运行依赖。

具体来看一下,迁移中期遇到的实际问题及解决方案。因为需要进行跨平台的构建,选用了cmake作为工具链,但是在某些平台上面临cmake、gcc工具链的缺失,那么就需要龙芯或OS厂商提供工具链。

在编码阶段,我们团队统一了编码工具,由于VSCode目前在其官网上还未提供MIPS架构的安装包,VSCode无法使用,因此选择了Qt Creator这一轻量级的IDE作为替代工具,之所以选择Qt Creator,主要因其对Qt的开发调试比较友好,尤其对于Qt的数据结构,例如常用的QString、QRect等数据结构能够显示其内部信息,比非Qt出品的IDE使用更加方便。

部署时可能存在运行时依赖缺失的问题,则需要由龙芯或OS厂商提供相应的运行时依赖软件包。

5、迁移过程中遇到的问题&解决方案

  1. Windows平台文件系统中路径分隔符是反斜线(\),Linux的路径分隔符是斜线(/),另外Linux文件系统的文件路径名称区分大小写,而Windows并不区分,这些问题都需要注意。基于以上原因,输入法所有C++代码中include的头文件都使用斜线进行路径分隔,防止在不同系统中编译出错。
  2. 统一使用UTF-8字符编码。UTF-8编码的优势:兼容英文的 ASCII编码,由于英文字符是常用字符,因此使用UTF-8编码比UTF-16,UTF-32等编码节省空间,另外UTF-8编码无字节序问题,其他多字节编码存在大端、小端编码值的差异。

6、 迁移后期遇到的问题&解决方案

完成迁移中期的工作后,输入法就可以正常运行了,但仅可以正常运行还远远不够,搜狗输入是要提供极致的输入体验,因此在迁移后期需要在运行流畅性及用户体验等方面进行优化、调试。下面分享两个迁移后期的问题。

  1. 手写输入出现卡顿:输入笔画越多,卡顿越明显。例如下图,红框部分手写输入区域,经分析,产生卡顿的原因为UI刷新逻辑,原有的刷新逻辑为全量刷新,例如“大家好”三个字,书写过程中的每一笔都会进行UI刷新,随着笔画的增多,刷新就会出现卡顿。找到了问题原因,采取的解决办法为递增式刷新,即只绘制有变化的部分,如图,写“大家好”的“好”字的最后一笔“子”时,只有最后一笔的“子”进行绘制,其他笔画以及控件并不会重新绘制,大大提升了绘制效率,改进后手写的流畅度大幅提升。

干货应用迁移|搜狗输入法在龙芯平台上的适配与应用

  1. 属性设置app启动慢:通过使用性能分析工具-火焰图,进行问题定位。火焰图的分析结果如下图。 火焰图Y轴为调用栈(调用方向:从下向上),X轴为采样点的记录。因为CPU中一般会有PMU单元记录程序运行过程中硬件使用情况,采集点数越多,代表该函数运行时间越长。需要注意的是X轴不是时长,只表示采样的数量。图中蓝色部分,其占用的时长超过app启动时长的40%,根据函数名称可以判定,该函数主要完成界面创建,初步确定属性设置app启动的性能瓶颈为界面创建,再结合性能日志工具,确定了问题原因确为UI页面创建耗时较长。经评估,采用了延时创建的方法处理该问题。属性设置的UI页面比较复杂,一共为7个,且页面间可以任意切换,但同一时刻只会显示一个页面,基于这种使用方式,在属性设置程序启动时,只创建用户可见的页面,待程序启动完成后在后台再逐步创建其他页面,既提升了用户体验,又保证了功能的完整,改进后启动效率提高了40%。

干货应用迁移|搜狗输入法在龙芯平台上的适配与应用

搜狗输入法不会满足于现有成绩,后续还会有更多规划。在产品功能方面,计划添加符号大全、语音合成、手写支持字符等功能,在基础品质打磨上也将继续努力,不断提升输入准确率,提高语音及手写识别的速度,从而让用户享受到更为极致的用户体验。

问答环节:

Q1:现在是否能够提供龙芯架构下的deb包?

A1:目前还未提供,请网友持续关注。

Q2:搜狗输入法支持阿拉伯语?

A2:目前支持的小语种有几十种,需要明确网友关注的是手写输入还是语音输入。

Q3:搜狗输入法和jetbrains全家桶冲突的问题处理得怎么样?

A3:目前在积极沟通处理中。

Q4:搜狗输入法在安全方面的设计有哪些?

A4:搜狗输入法中提供了加解密、认证模块;输入法安装包做了签名,在加载时会进行签名验证,另外也提供了接口级别的加密认证,通过这些技术手段来实现搜狗输入法的安全性。

Q5:应用cmake gcc以及外部依赖的PC端的软件迁移,其必要性体现在哪里?

A5:cmake构建系统是跨平台的,通常在Windows上使用VC,但VC不能在非Windows平台使用,因此考虑到跨平台要求,采用了cmake构建系统,因为cmake既可以生成Linux 系统下的makefile等工程管理文件,也可以生成Windows系统下VC开发工程,从而实现了构建工具的跨平台化。

龙芯技术博客:
https://blog.csdn.net/loongnix?spm=1010.2135.3001.5343&type=blog

龙芯技术社区:
https://loongson.cloud.csdn.net/


这是一个小芯芯
1 声望2 粉丝