根据talkingdata的数据,目前有70%左右的智能手机在运行Android系统,这款在2007年由Google发布的移动操作系统,一经发布就在全球掀起了移动化浪潮。如今14年过去了,现如今Android系统怎么样了?
3月18日,我们邀请到了步山老师,让他为我们说说,Android模拟器未来的发展如何。
Android模拟器底层技术实现
Android模拟器是令Android系统大红大紫的一个重要原因。简单来说,所谓的Android模拟器就是可以在其他的平台,如电脑上模拟出Android手机运行环境,并能体验Android系统应用的一种技术。
目前常见的模拟器有官方的Android Studio Emulator,以及LDPlayer,Bliss OS,Phoenix OS等等。从早期基于X86架构的模拟器发展到今天,已经发展到可以基于容器和云计算技术来构建模拟器了。
下面,我们来看看整个Android软件堆栈,如下图所示,从上到下依次是Android软件层、Java API,原生库、虚拟机、硬件抽象层、Linux Kernel。
硬件抽象层主要作用是将一些技术细节隐藏起来以方便开源,更多是商业层面的考量,紫色的部分是原生库,比如OpenGL ES是图形图像相关的库。
但有一个问题需要注意,上面这个系统是无法在X86的环境下运行的。为了解决这个问题,官方利用X86的技术重写了虚拟机以及Linux Kerenel等多个底层模块和驱动。替换掉后,就变成了如下图所示的架构:
整个系统架构了解清楚了,下面,我们再来看看Android模拟器是如何实现的,先来介绍一个重要的工具—Goldfish,它是一种虚拟的ARM处理器,Android模拟器通过它来运行arm926t指令集。下图就是Goldfish如何逐步实现Android模拟器的。Frameworks代码层通过调用Server来实现应用的请求,Hardware是硬件抽象层。
模拟器遇到的问题
原生库
在Android模拟器实现中有一个应用原生库的问题,因为不同的Android 设备使用的是不同CPU,而不同的CPU 支持不同的指令集。CPU 与指令集的每种组合都有专属的应用二进制接口(ABI),如下图所示:
下面我们看看如何通过二进制指令翻译—houndini解决这个问题
通过触发Nativebridge机制,在“/proc/sys/fs/binfmt_misc”下的名为“register”的文件中写入了两串字符串,通知Dalvik/ART:
所有使用ARM指令集的可执行和动态库ELF文件都用houdini程序打开所有ARM64指令集的可执行和动态库ELF文件都用houdini64程序打开图形图像
可以想象,模拟器中图形图像对系统的开销是非常大的,可能会有几千条指令在同时运行。所以我们需要用到模拟计算来提升效率,如下图所示,guest是Android系统本身,host通过共享内存的方式将指令做转换。
交互
既然是操作系统,那人机交互肯定是少不了的。在Windows系统中,是通过鼠标键盘来输入数据,而一般安卓设备是触摸屏,所以我们还需要通过触摸屏虚拟设备加底层硬件驱动,将电脑端传过来的数据转换为触摸屏的数据。
Android模拟器演进
容器
这里我们又提到了容器,还记不记得之前《Hello,World公开课》中关于容器的介绍么,在这里,利用容器可以即隔离虚拟的应用环境,又可以高效利用宿主机的硬件。
WSL
WSL (Windows Subsystem for Linux)支持适用于Linux的Windows子系统在Windows上运行ELF64 Linux二进制文件。主要目标是提高文件系统性能,以及添加完全的系统调用兼容性。
以华为云为例,如下图所示,它是由Guest OS、虚拟化、主机OS、硬件平台这个部分构成,AOSP是Android的开源版本。
记得前面说的么,在安卓模拟器中,我们要通过异构指令的方式,把arm的指令翻译成X86的,这样做性能会大幅度削减,如果采用同构指令的方式,性能基本没有折损,因为华为云下面的鲲鹏云平台就是基于arm的。
今日话题:你支持安卓还是IOS呢?
你的点赞与关注是小编坚持的动力。
举报/反馈

开课吧

2577获赞 1.2万粉丝
在线职业教育,帮助用户实现可持续职业成长
北京开课吧科技有限公司官方账号,教育领域创作者
关注
0
0
收藏
分享