当前位置:首页 > 虚拟机 > 正文

安卓就是java虚拟机


一、关于android和x86的几点疑问。android基因linux内核,系统除了内核还有其他什么Android除了基于Linux内核之外,还有自己的顶层运行环境、相关函数库、命令程序等。
其实android是一个基于Linux内核的JAVA虚拟机环境。
实际的Android程序都是运行在JAVA虚拟机之上的解释型语言程序。
但是翻译后的语言程序的性能不如原始的二进制程序。所以Android也有NDK软件。
即Android中存在一些本地二进制内容。这样,本地程序运行可以达到最高效率,并且可以根据CPU(如NEON)的功能进行优化。
指令集各不相同,但其JAVA虚拟机是解释型语言,基于JAVA语言的程序可以任意运行。只要能够保证Android上的JAVA虚拟机能够在x86上成功运行即可。
但是Android还有一个问题,就是JAVA虚拟机在x86上针对ARM性能进行了优化,而这种性能提升已经消失了,需要在x86上重新优化。但听说Android的JAVA虚拟机语言也针对ARM设备进行了修改构建,因此这种针对ARM性能优化的JAVA程序在X86系统上也会遭受性能损失。
Android操作系统出现后很长一段时间,其在x86操作系统上的运行效率并不是很好。
现在有了NDK程序,ARM二进制程序无法在x86上运行。这些程序都不能运行。
不过x86的优点是性能很强,而且仿真技术现在也很强大。在x86上,可以使用虚拟机(qemu的用户模式值得一看)来运行ARM二进制程序。
但是,虚拟机仍然会遭受性能损失。
所以,未来Android的共享CPU架构仍然是一个问题。纯JAVA程序说起来容易,但是使用NDK的程序就有问题了。
不过,llvm编译器提供了另一种方式,可以作为虚拟机运行,也可以编译成本地程序并转换成二进制来提高性能。Android可能会考虑使用此方法或类似的方法来允许NDK程序通过CPU执行。代价是安卓必须自带翻译器,这个代价不小。
MACOSX还有另一种方法。MAC放弃IBM的PowerCPU并改用Intel的CPU后,其软件附带了两套二进制程序。旧的G4CPU使用软件代码来指定软件中的电源指令。新的IntelCPU硬件自动使用内部的x86指令来运行程序。从而实现最佳的双指令集操作。然而,代价是这样的程序包含两组指令的内容,从而使大小增加了一倍。
目前,使用NDK的软件似乎无法使用。当前的一些x86手机不太可能会使用虚拟机技术来运行NDK程序。现在Linux中的qemu用户态配合内核的binfmt_misc函数,可以让系统自动识别某种架构的程序并调用qemu来执行。