基于Android的高性能云终端系统的设计与实现
作者:杨雄
来源:《贵州大学学报(自然科学版)》2018年第03期
摘 要:针对主流虚拟化协议对Android系统支持不足和ARM平台厂商对Linux系统的显示驱动支持有限的问题,提出一种将Android系统与Linux系统相整合的解决方案,以Android系统的驱动为基础构建Linux系统应用,通过中间层技术将Android系统的Bionic显示驱动接口转换成Linux系统下Glibc应用能够用的功能接口,具体阐述2D图形显示和高清视频播放的实现。该方案利用了Android系统与Linux系统的优势,扬长避短,使Android平台的设备作为高性能云终端成为可能,扩展云终端的选型范围,降低云终端的成本。 关键词:Android; 云终端; Linux 中图分类号:TP316 文献标识码: B
云桌面构建于企业级虚拟化平台之上,共享服务器CPU、内存、网络连接和存储器等底层物理硬件资源,让多个用户桌面以虚拟机的形式独立运行,为每个用户提供一套独立的桌面环境[1-2]。现有云桌面的前端设备云终端主要以X86+Windows和ARM+Linux两种平台为主,长期以来X86+Windows占据着云终端的主导地位。但是近年来,随着多核ARM平台的迅速发展,通过对系统软件的深度优化,ARM+Linux平台的云终端已经可以提供完美的远程桌面体验,支持高清的视频重定向,而且ARM+Linux平台的云终端成本远低于X86+Windows平台。
2014年,Android设备的销售量占到全球份额81%的绝对优势[3],但目前主流的虚拟化协议如Citrix的ICA[4]、VMware的PCOIP[5]和Red Hat的SPICE[6],对Android系统的支持还停留在基础办公上,对于协议的扩展如MMR或者USB设备重定向的支持几乎没有,同时Android系统主要针对触屏操作,对鼠标操作的支持较弱,导致其虚拟化应用体验较差。但这些虚拟化协议在ARM+Linux上的实现以及用户体验都达到一个较好的水平。
由于受限于云终端的市场规模,ARM厂商对Linux系统的驱动支持有限,只提供Android系统下的驱动,且都是闭源的二进制动态库,说服厂商针对Linux系统重新编译提供一套动态库几乎是不现实的,如国内主流的ARM厂商海思和瑞芯微都已不再提供针对Linux的显示驱动,这导致云终端的ARM+Linux硬件平台选型受到极大的限制。
龙源期刊网 http://www.qikan.com.cn
综上,在ARM+Linux上虚拟化体验较好,但缺乏原生厂商的支持,而在ARM+Android上虚拟化体验较差,但其驱动较为完整。由于多数厂商不提供Linux系统驱动导致
ARM+Linux云终端平台选型非常困难,若能够基于Android驱动构建Linux系统及其应用,那就能够将Android设备纳入云终端的选型范围。 1 Android系统与Linux系统
Android系统与Linux系统的系统架构如图1所示。从系统架构看,Android本质上就是一个Linux变种,二者使用了相同的内核,但在基础库上有较大区别,Linux是基于Glibc,而Android则重写了Glibc,衍生出了Bionic[7]。但由于Bionic与Glibc不完全兼容,加上链接器的不同,导致在Android上编译的动态库是无法直接在Linux系统中使用。
ARM厂商提供的Android的驱动位于HAL(硬件抽象层)[8],而HAL依赖于基础库Bionic,若希望Linux系统的应用能够调用Android系统的HAL驱动,则需要解决基础库(Bionic与Glibc)的兼容性问题。因此在系统融合方案中在Bionic与Glibc之间构建中间层LibBridge,让Linux系统的Glibc环境下的应用通过LibBridge中间层能够调用Android系统的基于Bionic库的驱动。在具体实现中,该方案基于瑞芯微RK3188平台,实现了2D图形显示和视频硬解码功能。
2 云终端系统的设计与实现 整合系统的框架如图2所示。
系统尽可能地保留了Android原始的HAL及相关的服务,在进入Android系统后,通过chroot的方式进入Linux系统并启动相关的服务和应用程序主界面。系统启动流程如图3所示。
在Linux系统中调用Android的显示驱动及多媒体驱动,实现了支持1920×1080分辨率的2D图形显示和1080P高清视频的流畅播放,达到了高性能云终端的基准,在该系统中的Citrix虚拟化体验并能够达到Citrix的Ready认证水平[9]。下面具体阐述整合系统中中间层LibBridge、2D图形显示和高清视频硬解码的实现。 2.1 中间层LibBridge的设计与实现
中间层LibBridge的主要作用是把Android系统中基于Bionic编译的驱动库中的符号替换成与Linux系统中Glibc相兼容版本的符号。它封装了基于Bionic编译的库,当Linux的应用需要调用到Bionic库时,会首先加载LibBridge中间层,LibBridge中间层就会使用其内部实现的一个基于Android链接器去加载真正需要加载的库。
龙源期刊网 http://www.qikan.com.cn
它的具体原理为:首先封装所有Android驱动库的接口,然后使用链接器的机制动态加载Android驱动库,最后根据实现调用来重定向接口。其中链接器是一个基于Android系统中链接器修改而成的版本,但其中加入了对Glibc符号的特殊处理。其原理如图4所示。
可以看出,包含字符映射的LibBridge的hooks哈希表中包含兩部分内容:一部分是hooks数组定义的映射,其字符地址指向LibBridge中实现的封装函数,由封装函数来处理兼容性问题,然后调用Glibc对应版本。 另一部分是Bionic的字符到libc.so.6和 librt.so对应版本的直接映射。前者是静态定义的,后者则是运行时生成的。其中处理字符重定位的关键函数reloc_library实现为:
static int reloc_library(soinfo *si, Elf_Rel *rel, unsigned count) {
Elf_Sym *symtab = si->symtab; const char *strtab = si->strtab; …
for(idx = 0; idx < count; ++idx) { …
if (sym != 0) {
sym_name = (char *)(strtab + symtab[sym].st_name);
INFO(\"HYBRIS: '%s' checking hooks for sym '%s'\\n\", si->name,sym_name); sym_addr = get_hooked_symbol(sym_name); if (sym_addr != NULL) {
INFO(\"HYBRIS: '%s' hooked symbol%s to%x\\n\", si->name,sym_name, sym_addr);
龙源期刊网 http://www.qikan.com.cn
} else {
s = _do_lookup(si, sym_name, &base); } … } } }
其中獲取hooks哈希表具体字符的get_hooked_symbol函数实现为: void *get_hooked_symbol(char *sym) {
struct _hook *ptr = &hooks[0]; static int counter = -1; while (ptr->name != NULL) {
if (strcmp(sym, ptr->name) == 0) {
return ptr->func; } ptr++; }
龙源期刊网 http://www.qikan.com.cn
… }
基于Linux系统的Glibc的应用调用LibBridge的工作流主要如下: (1)应用程序启动;
(2) 若是动态链接,且应用程序中调用了Android 库的接口,则使用LD加载LibBridge库;
(3)通过调用LibBridge库的接口来调用真正的Android库接口。
通过中间层LibBridge,Linux系统的基于Glibc编译的应用就能够间接调用Android系统的HAL驱动库了,基于此就能够在Linux系统中调用Android的GPU驱动来实现2D图形显示。
2.2 2D图形显示的实现
目前Linux采用的显示架构都是Xorg,虚拟化厂商提供的客户端也都是基于X的。Linux系统的显示架构如图5所示。
从上述架构可以看出,在Linux系统中使用了Android自带的显示服务,能够最大限度的利用Android原生驱动效率,同时也具备了高可移植性,可以屏蔽Linux系统对Android底层显示驱动的依赖。
在LibBridge中包含了2D图形显示的EGL平台接口,它是Android平台的libEGL库的封装实现,其内部会加载真正的libEGL库,在hook一些函数的同时也会增加一些扩展函数,它主要包含两种后端的实现:fbdev和wayland,其结构如图6所示。 2.3 高清视频硬解码的实现
目前Linux上采用较多的多媒体框架是Gstreamer,基于可插拔插件的Gstreamer多媒体应用框架应用灵活,扩展性强,能够快速装卸功能模块,极大地简化多媒体应用的开发过程[10],Citrix的多媒体重定向也都是Gstreamer框架,如图7所示。
Gstreamer通过LibBridge调用Android原生的MediaCodec[11],能够有效的利用Android的硬解码,屏蔽Linux系统对硬解底层驱动的依赖。在针对RK3188的Android版本中已提供OMX硬解的支持,因此只需要在Wayland中支持Gstreaner的xvimagesink视频输出,即需要在Wayland中支持X视频扩展[12]。X视频扩展是X Window系统的视频输出机制,它主要用于调整视频控制器硬件中的视频内容大小,以放大给定视频或以全屏模式观看。没有X视频
龙源期刊网 http://www.qikan.com.cn
扩展,X将不得不在主CPU上进行缩放,这需要大量的处理能力,会减慢或降低视频流,这对ARM几乎是不可接受的,因此需要在Wayland中针对RK3188平台的X视频扩展接口,利用其硬件缩放和YUV加速能力。X视频扩展的实现只需要在Wayland中增加RK3188的设备驱动,并实现XVideo接口即可。RK3188图像输出接口的设备驱动在其内核中已定义,不需要调用Android 下的相关库,因此根据SDK代码实现framebuffer相关操作即可。关键部分代码为:
//RK平台的XVideo初始化函数 int rk_init(ScreenPtr pScreen) { …
rk_xvideo * rkxv = rk_xvideo_init(RkFb_private); if (rkxv) {
XVideo_private = XVideo_Init(pScreen, &rkxv->intf); } return 0; }
在wayland的初始化函数中将xv_private修改为rk_init,关键代码为: void
xwl_xv_init_port(ScreenPtr screen, glamor_port_private *port_priv, int port_number) { …
port_priv->xv_private = rk_init_xv();
REGION_NULL(pScreen, &port_priv->clip); }
龙源期刊网 http://www.qikan.com.cn
3 总结
本文构建的基于Android的高性能云终端,通过构建LibBridge中间层解决了Glibc与Bionic的兼容性问题,以Android系统的驱动为基础构建Linux系统应用,将Android的优势与Linux优势相整合,使得Linux系统的应用能够充分利用Android系统的硬件驱动,扩大云终端ARM+Linux平台的选型范围,使云终端从传统PC、专用的云终端设备扩展到Android移动设备上。 参考文献:
[1]徐浩, 兰雨晴. 基于SPICE协议的桌面虚拟化技术研究与改进方案[J]. 计算机工程与科学, 2013, 35(12):20-25.
[2]KHAJEH-HOSSEINI A, GREENWOOD D, SOMMERVILLE I. Cloud Migration: A Case Study of Migrating an Enterprise IT System to IaaS[C]// International Conference on Cloud Computing. IEEE Computer Society, 2010:450-457.
[3]卿斯汉. Android安全研究进展[J]. 软件学报, 2016, 27(1):45-71.
[4]LI J, JIA Y, LIU L, et al. CyberLiveApp: A secure sharing and migration approach for live virtual desktop applications in a cloud environment[J]. Future Generation Computer Systems, 2013, 29(1):330-340.
[5]CALYAM P, PATALI R, BERRYMAN A, et al. Utility-directed resource allocation in virtual desktop clouds[J]. Computer Networks, 2011, 55(18): 4112-4130.
[6]徐浩, 兰雨晴. 基于SPICE协议的桌面虚拟化技术研究与改进方案[J]. 计算机工程与科学, 2013, 35(12):20-25.
[7]张超. 面向桌面Linux的Android运行环境构建[D]. 长沙:国防科学技術大学, 2012. [8]李宇成, 梁宗希. Linux摄像头驱动的设计优化及其对应的Android下HAL封装设计方法探究[J]. 计算机应用与软件, 2016, 33(9):249-253.
[9]董慧, 方金云, 赵红超,等. 基于Citrix的异地软件共享系统的设计与实现[J]. 计算机工程, 2009, 35(1):49-51.
[10]宫健. 基于Gstreamer的嵌入式流媒体传输系统的研究与实现[D]. 南京:南京邮电大学, 2016.
龙源期刊网 http://www.qikan.com.cn
[11]万海清. 基于Android的运动检测视频监控应用的设计与实现[D]. 武汉:华中科技大学, 2015.
[12]SYSTEM X W, SOFTWARE F, ORG F. Video Acceleration API[J]. Human Immunology, 2014, 75(2):124-128. (责任编辑:周晓南)
因篇幅问题不能全部显示,请点此查看更多更全内容