22

极术小姐姐 · 2023年01月31日 · 广东

麒麟桌面操作系统运行安卓移动应用的技术实践

作者 | 孟庆彬
策划 | 刘燕,嘉洋

本文整理自麒麟软件桌面研发部资深研发工程师孟庆彬在 DIVE 全球基础软件创新大会 2022 的演讲分享。

以下为孟庆彬演讲的精华内容,经编辑。

国产操作系统目前生产现状

以飞腾平台为例,截止到 2022 年 1 月,飞腾平台已经适配了 4000+ 的生态软件。经过分类统计,主要的分类聚焦在办公软件、影音软件、金融软件、游戏软件、社交软件、安全和存储上。

需要强调的是,游戏软件也是一些小众的游戏,4000+ 的应用也基本只能覆盖到这几类的软件行业。考虑到目前国产操作系统使用的情况,现在的主要用户还是党政军企这些 ToB 的企业,以办公安全场景为主,其他的都没有,这也就导致了 Linux 原生的生态倾向性比较明显。

c6ca2087f6da50ef2b38e15f5feaea9e.png

目前 Linux 生态的短板就是生态很不丰富,与移动或者 Windows 生态相比,没有什么可比性。相对而言,办公类的软件比较成熟,但是像 Photoshop,还有重办公设计类的软件也是不足的。

麒麟系统如何融合移动应用生态

麒麟有 KMRE,麒麟移动运行环境的技术,这个技术我们给它打了标签,包括技术、融合、便捷。今天重点介绍一下 KMRE 的主要功能和工作原理。

5b3bcd4df0c5724e7c74507606c00f24.png

首先介绍一下麒麟移动引擎主要的特点和主要的功能。它支持海量 APP 秒级启动。直接使用硬件,无性能损失。安卓与 Linux 窗口显示融合。统一的输入法,统一的音频设备,统一的输入设备,摄像头,视频通话。文件互通,剪切板互通,打开通知消息互通,打开方式互通。APP 的统一管理,键盘辅助功能,鼠标滚轮功能,截图功能。APP 同时运行,APP 全屏切换,横竖屏切换,还有 Linux 共享桌面。这块功能下面会一一展开介绍。

26bf36bdd560deb66ec7499f721b5aa0.png

在 Linux 上,如果想运行安卓 APP,主要有两个大的技术方向。第一个就是 Google 的 Arc 容器类的方案,Google 的 Arc 是商业的 Chrome 组件,支持应用有限,效率一般。还有虚拟机和模拟器,像 Bluestacks 和 GenyMotion 效率都比较低,资源占用率很高,环境与宿主系统完全隔离。

994acaaa64ae33ec25e8a41f62c6fe5b.png

KMRE 不是虚拟机,它是类似于容器的一套方案,但也不是传统意义上的容器。它真正将 Linux 操作系统和安卓操作系统合二为一,从本质上让麒麟 OS 真正支持安卓 APP 的运行。共用内核,直接使用硬件,无性能损耗,资源共享,目前支持 arm 和 x86,也支持了多种 CPU 和 GPU。

总结来讲,Linux 目前运行安卓 APP 无非两套大的方案,要么就是容器,要么就是模拟器。我们是在容器的基础上改造了一个不是容器的方案,但也是继承了容器的方案。

KMRE 显示目前有两种模式,一种是通用模式,通用模式主要是适配了驱动闭源的 Nvidia 卡、Intel 显卡,兼容性比较高。另一种是高性能模式,目前适用于开源的驱动,比如 AMD 的显卡,目前是 0 性能损失。例如 KMRE 运行“和平精英”时,画质是不错的,实际的操作流畅度很高,帧率也很高,在高性能模式下体验非常好。

ad3580ea4e637703e60dc92a79a22b4c.png

在 OS 上运行安卓应用,大家都在讲的一个概念叫多 APP 多窗口同时运行。实际上对于安卓手机、安卓平板而言,它们基本上都是在一个屏幕同时只能运行一个应用。如果我们想多运行几个应用,会涉及到切换。对于用户的操作而言,他只能同时操作一个应用。但桌面系统大家已经熟悉了窗口式的应用,用多少个应用就开多少个窗口,同时可以看,可以用。而且对于大家熟悉的笔记本、台式机,它的屏幕是大横屏的形式,多开几个窗口显示器效果也会比较好。

ad5e006f32c10d2bc040ac3228d227df.jpg

下面再介绍一下 Linux 下的桌面共享。正常的话,Linux 应用,或者 Windows 上会议类应用的共享桌面,都是共享自己的主界面。当然对于安卓而言,只能共享安卓手机的窗口。对此,我们做了一些工作。我们现在共享的时候,Linux 下跑腾讯会议,或者是 QQ 共享桌面,实际共享的是整个桌面。可以看到,图中是 Linux 原生的整个桌面,这保证了操作体验,也保留了在 Windows 下的共享桌面习惯,比较方便。去开会,去共享桌面,大概率会想要共享整个桌面,而不是单独的一个窗口。目前我们内部开会都是这样来做的,还是很方便的。

aec8164788a9ee00d7c64dd11646f300.png

文件互通。大家应该都比较熟悉 Linux 的文件系统以及安卓里面的文件系统,对于安卓而言,它的目录相对而言比较混乱,比较零散。对于 Linux 而言,显示更像是 Windows 这种可能用起来比较习惯。通过一些手段,一些努力,目前在安卓上面可以直接访问 Linux 文件。

图中是微信里面要给朋友发文件,正常的话都是微信打开文件系统,打开它的存储,去找对应的目录。我们做的优化是直接选择 Linux 目录下的文件直接传,通过微信发出去。下面的图片就是把安卓的文件系统在 Linux 下显示。这是一个 Linux 文管,能够直接看到安卓完整的目录结构,也可以按类型去看。安卓目录结构比较混乱,但如果按分类模式去看,也相对比较便捷。我们这块也是结合了各自的优劣,既能够按照符合 Windows 习惯的目录结构去看,也可以符合安卓便捷的方式去看,比如说按图片、音频、视频、文档分类,这两者都有。

15586ea8c96c170a3e983b091942c378.png

再来看看摄像头。因为安卓摄像头分辨率会比较高,摄像头可以跟着横竖屏方向去旋转。但 PC 上的摄像头一般分辨率比较低,且固定在某个位置,正常也不会有人去旋转它。这就导致了在摄像头使用上跟安卓存在着一些区别。由于我们的场景是 PC 上的摄像头使用安卓设备,所以在这方面也做了比较多的工作,目前已经适配了多款的摄像头。对于可以拍照、录像的 APP,绝大部分适配的功能都是没有问题的。尤其对于重点的应用,像微信、腾讯会议,目前内部也一直在用,视频通话很流畅,体验也很好。

466928f39f3ceb8c2f1c9472d676e67c.png

对于手机输入法,大家可能比较习惯点一个位置,下面弹出手机各种各样的输入法,然后手动去打字。有很多种输入法,包括手写的、拼音的、九宫格。但实际上在 Windows 上,桌面 OS 的情况下,大家都习惯直接用键盘、鼠标去输入。PC 上用键盘、鼠标打字速度是很快的,体验也不错,基于这一点,我们也在想怎么去实现。实际上现在也完成了可以用 Linux 的中文输入法直接输入到安卓系统里去。

图示就是在头条搜索,可以看到这个操作系统是安卓,输入法却是 Linux 的输入法,输入法会跟着光标走。另外,不管是 Windows,或者是 Linux,大家都习惯了用一些快捷键,像复制、粘贴、全选、撤销,就是对应的 Ctrl+C、Ctrl+V、Ctrl+A, Ctrl+Z 这些快捷键,而原生的安卓可能需要长按,因为它没有键盘、鼠标。这些我们都已经适配完成,可以通过快捷键去操作安卓这部分,这种体验是很流畅的。

0ffd29be6f67d68ef6feea49e12f7d48.png

安卓里面的游戏也适配了 Linux,包括 PC 机器的键盘、鼠标和游戏手柄。我们可以通过手柄,或者键盘、鼠标去玩一些游戏,体验很不错。为什么特别强调这块内容?因为我们在做游戏场景的时候也遇到了一些问题。打游戏可能需要十个手指多点触控,但实际上在 Linux 下这块支持不是特别友好。尤其像滚轮,像游戏的轮盘操作,以及手柄类自定义的组合键是比较多的。这块我们也是做了很多的事情,解决了轮盘的转换,还有在键鼠这块解决了多点触控和组合键的问题。目前,通过游戏手柄去玩大型的游戏是没有问题的。

什么叫打开方式互通?正常的安卓应用默认都是用安卓应用去打开,但安卓应用用 Linux 本地的应用去打开,Linux 本地应用用安卓应用去打开,这样体验会更好。

f586d1026767e5325032c795975777d6.jpg

比如说用微信的时候,突然收到了一个文档,用安卓内置的 WPS 也可以,但是如果能够用 Linux 下的 WPS,体验是不是更好?因为像 WPS 这种应用肯定是 Linux 原生操作起来更方便、更快捷。还有类似于图片查看器,也是在 PC 上直接操作更加灵活。网页也是一样,在 PC 上开网页可能开好几个,操作起来也比较便捷,但在安卓上,别人要给你发个网页或者发个网址都比较麻烦,效率或者体验肯定不如 PC 好。

我们在安卓里面做了一个插件,通过这个插件,可以把一些文件类型直接用 Linux 原生去打开,图片中就是别人给你发了一个 Word 文档,在右键的时候会打开右键菜单,这个时候我们就可以把应用用 Linux 原生的应用打开。

再介绍一下应用切换融合。希望让用户不要感知到跑的是一个安卓应用,还是一个 Linux 应用。我们从安装到使用都做了很多改进,比如说我们在安装的时候,让用户从应用商店下载、安装,在应用商店用户只需要去搜索对应的软件就可以,他不需要去关心这个软件到底是 Linux 软件还是安卓软件,他只要想用这个软件,去下载就可以了,我们就会给他自动安装。安装之后也符合常用的 PC 的操作习惯,安装之后会在桌面上有图标,任务栏也会有对应的图标,入口和 Windows 是统一的,用户用的时候,就可以直接点击,想用几个就开几个,是支持多窗口的。

对用户而言,都是完完整整、一个个独立的窗口,符合用户习惯。既然是窗口应用,当然支持用 Alt+Tab 快捷键进行应用切换。在任务栏可以预览它的效果,每个应用会有独立的预览情况,对用户而言,他不会感知到到底现在是一个 Linux 应用,还是一个安卓应用。

d6e103e59608e861cb723fad311ce7a4.png

我们从安装到使用,都是为了保证用户体验一致,安装好了之后在开始菜单就会有对应的图标,也可以在“自定义”大的桌面里面看到对应的图标。用户也可以把它固定到任务栏,或者直接右键发送到桌面快捷方式,用户会觉得这是 PC 上惯用的应用习惯。

正常的安卓手机通知都是在安卓的主界面上有一个下拉的通知栏,很多应用信息都会往那里发通知,现在为了和桌面 PC 深度融合,我们的通知会在系统的通知栏弹个气泡通知用户,如果你的应用是在任务栏下面,它就和 QQ、微信的 Windows 的习惯是一样的,用闪烁来通知用户有消息来了。

67085aba40700863e0716acb55836cef.png

以上是 KMRE 主要的功能介绍。目前通过 KMRE 已经完成了对 4000+ 移动应用的适配,以后应用会上的越来越多。通过 KMRE,也引入了 4000+ 的移动应用。我们通过这些手段,已经可以把安卓的应用比较快速、低成本地迁移到 Linux 生态上面来,这样是对 Linux 生态很大的补齐。

58d4879f5cc517a8912456e65f08761f.png

目前适配了以下这些重点应用。比如说金融类的同花顺,还有一些网银。影音类的像爱奇艺、抖音、QQ 音乐。社交类的 QQ、微信。教育类包括腾讯课堂、学习强国。游戏类的包括和平精英、QQ 飞车。办公类的包括钉钉跟腾讯会议。也有一些应用,它可能现在还没有 Linux 原生应用,或者是 Linux 原生应用做得还不是特别好,然而移动应用已经很成熟了,这样的话能够很好地解决用户的实际需要。而且也可以支持多个窗口同时打开,随便开几个都没有问题。

麒麟移动引擎主要工作原理

4a45a05f12cd15caf5c728085c2708c2.png

麒麟移动引擎的整体架构包括,KMRE 的整体架构,最下面是硬件平台,有不同的 CPU、GPU。比如支持国产的飞腾、麒麟 990,还有 Intel、AMD。GPU 也有很多种,像 AMD、Nvidia、Intel 这种。对不同的硬件,我们都需要做适配,但因为抽象出了一个硬件的适配层,所以适配工作目前只是简单的配置工作就可以完成。

一个模块,为了解决安卓上网的问题,毕竟网络还是在 Linux 侧,安卓侧应用也要上网,我们搞了一个 VirtWifi 内核模块可以解决安卓内部的上网。这块目前也在努力,原来是一个虚拟的网络,目前已经基本上实现了安卓可以感知实实在在的网络。

在共用内核的基础之上,我们里面有两套系统,一个是 Linux 系统,一个是安卓系统。因为两个系统之间要紧密耦合,一些组件要交互或者共用。实际上在 Linux 下面有一个类似于启动进程的模块,这个模块可以理解为安卓的 AMS,负责安卓应用的生命周期管理。

还有我们的管理服务,管理服务就是管理安卓的生命周期,因为对于安卓而言,如果用户用的话就把它用起来,如果不用就把它挂起来,既要保证它的响应速度,还要解决它的功耗问题。还有图形窗口,还有显示服务,实际上窗口跟显示都是在 Linux 侧来融合的,这两部分就是为了解决安卓显示窗口跟 Linux 怎么融合。

在软件商店方面,因为安装的时候用户无需感知是 Linux 还是安卓,所以我们对软件商店也做了一些修改。音频服务就是为了解决数据、音视频通话、输入输出设备问题。文件管理器插件就是怎么样把文件系统互相打穿。文件互通服务就是为了解决分享这块,用应用去打开时,这块涉及到一些文件路径的同步。还有 OpenGL 渲染库,这是显示相关的。还有通信模块,解决 Linux 跟安卓高效通信的问题。

在安卓部分我们也做了比较深度的修改。例如在应用层,我们有自己的 KmreLauncher、KmreManager,还有 InputMethod。KmreLauncher 替代了安卓原生的 Launcher,因为我们现在做的是跟 PC 的深度融合,所以安卓的 Launcher 是不需要的,把一些机制用自己的 Launcher 去替代了。

KmreManager 就是为了解决 Linux 侧安卓端的管理以及通信问题的。InputMethod 主要就是为了解决输入法。对于 Framework 修改,我们也做了一些修改,比如说显示 SurfaceFlinger,还有输入的 InputFlinger 这些,都是为了更好地让这两个系统融合到一块。HAL 在显示还有硬件方面做了修改,像 Gralloc、Audio、EventHub、Camera。手机上的传感器设备会比较多,如果这些 PC 上有就用 PC 的,如果 PC 上没有,就要在 PC 上给安卓创建一个虚拟的设备。

经过这些模块组合之后,我们就在一套内核上跑了两套系统,两套系统就可以支持这两套系统的生态,比如 Linux 应用,安卓应用,使用起来比较灵活。

多窗口是怎么实现的?多窗口实际上是基于安卓 11 的虚拟屏技术,来实现窗口的多活。安卓本身它是有多个窗口显示的能力和接口的。但是考虑到安卓的实际产品,像手机、平板没有这种场景,所以这个技术用的人不是特别多。

目前安卓最新的版本也在往大屏方向切,这个技术可能会用得越来越多。我们是基于安卓的扩展屏这套技术,让应用打开到某些扩展屏的指定位置,再去控制扩展的生命周期,就是什么时候应该显示,什么时候应该销毁。通过这几个扩展屏之间的交互关系,来实现多窗口多活的问题。

5a6c339b3790628a6afb9a46cd9d7fbc.png

再介绍下麒麟移动引擎文件互通是怎么做的。Linux 可以访问安卓的文件管理器,安卓也可以访问 Linux 的文件管理器,这是怎么实现的?

Linux 系统跟安卓系统本质上文件管理器整体的设计上是统一的,这块没有多大的差异,主要的差异点来自于权限的不足,Linux 文件的权限体系跟安卓的权限体系不一样。目录显示、挂载都没有问题,但当访问时就会涉及到权限问题,只能看不能用是不可接受的。

我们主要修改了文件内核的一些模块,做了权限映射,这样就可以解决 Linux 跟安卓里面权限不同导致无法访问的问题。权限的问题解决了,其他的就只是文件的显示、挂载这些操作,这块可以做的场景是比较多。

65f63afa1cb6f26b99e4b16c4083d47a.png

显示有两种模式,一种是性能模式,一个是兼容模式。如下图所示,对正常的安卓应用,就是安卓去显示,走 SurfaceLinger,走 OpenGL ES,走 Gralloc,走 fb,走正常的显示,这是安卓正常的流程。

但是、为了安卓和 Linux 窗口去融合,我们用 Linux 去做窗口管理,在安卓显示时把 OpenGL ES 这些指令都接到了 Linux 的 Mesa 库,通过 Mesa 库再去操作 DRM,直接到窗口上去显示,这样性能会比较快。直接就相当于把 Linux 的显示系统,跟安卓的显示系统融合到一起,也形成了一个完整的显示系统。
02e2979c58e8352d58a8afbee48544ec.jpg

性能模式跟兼容模式的区别在于:性能模式主要参考了 AMD 驱动的开源方案。在沙箱中,移动环境执行图形渲染和合成,Linux 端只做绘制和显示。这样的话,减少了 JLES 命令进行传输和翻页带来的性能损耗,提高了安卓的运行效率和显示效率。渲染和合成是在安卓部分做的,Linux 只做绘制和显示。

对于兼容模式,有一些显卡可能没有开源出来,这块我们对沙箱中的移动环境中显示指令进行了转换,显示指令转换之后,Linux 上面的显卡进行渲染合成,这可以满足大部分的硬件加速需求,对显示环境具有良好的适应性,能够更好地实现显卡的兼容效果。兼容模式可能会比性能模式多了一些指令的传输还有内存拷贝损耗。在性能模式下玩游戏,一点都不会感觉到卡顿。

14717ae830f224b5dafc3f977cf36725.png

在视频编解码方面。正常安卓也有一套视频编解码能力,但这块跟 Linux 系统融合不能走软解,这样的话 GPU 占用太高了。安卓本身有 OMX 这套接口,这套接口是给一些移动厂商提供定制解码能力的。我们是用了这套接口,在硬件设备支持的情况下,优先使用解码芯片来加速解码,这样就减少了 CPU 的占用,系统的性能和流畅度就可以保证了,也充分利用了硬件加速能力。

7289841103b7c1811700d059515a74e0.png

麒麟系统在移动生态上的规划和布局

麒麟系统在移动生态上的规划和布局方面。KMRE 能够有效地把移动生态引入到 Linux 系统,补齐 Linux 系统生态不足的问题,随着一些新的技术的引用,应用会更快速地上架,以后应用会上的越来越多。

0ad41f99bc60eff898dda5c433174032.png
我们在一套内核中跑了两个系统,一个安卓系统,一个 Linux 系统,虽然说有些模块、有些组件是复用的,一些模块做了一些深度的耦合,但实际上,它还是一套内核跑了两个系统。

我们现在也在思考,怎么样构造一个真正的融合的系统。我们也参考了业界好的一些实践,看一看怎么样去打造一款真正融合的系统,只有一个系统、一套内核的融合系统,不会从技术上看上去有分裂。我们也在朝着这方面努力,也在打造麒麟最新的一代 OS 系统,持续做探索和突破。

现在移动端设备非常丰富,手机、平板、穿戴设备随处可见。用户怎么样跟麒麟系统互动,麒麟系统在移动设备上怎么更好使用?这块我们也有自己的思考,我们也在打造麒麟系统自身的移动办公生态。毕竟我们的客户大部分还是在办公行业,也会有一些移动办公需求。在这方面,我们也在努力做一些不一样的产品,希望给用户不一样的体验,帮助用户解决一些实实在在的问题。

讲师介绍

孟庆彬,麒麟软件,桌面研发部资深研发工程师。拥有 11 年工作经验,长期从事 Linux 系统与 Android 系统融合方向的技术研究。在麒麟公司主要负责麒麟移动运行引擎的设计与开发,主要负责将安卓生态引入到国产操作系统。

文章版权归极客邦科技 InfoQ 所有,未经许可不得转载。

文章链接:https://mp.weixin.qq.com/s/L6gLUNi0ag6wCSdIzv-pIw
推荐阅读
关注数
23559
内容数
1008
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息