x86架构的android手机兼容性问题
自从CES2012上Intel发布了针对移动市场的Medfield平台以来,市面上出现过一些基于X86的Android手机。
大部分Android应用都使用基于Dalvik Java代码开发。理论上,由于Dalvik代码在系统的虚拟机中执行,在x86的ATOM平台上不会有性能损失。但由于虚拟机执行效率的有限,对于一些高性能追求的应用,谷歌允许开发者使用原生的C语言代码。而原生代码是针对硬件平台编译,x86,ARM或是MIPS都有其相应的二进制文件。通常来说,针对ARM平台编译的二进制代码,x86的处理器是无法直接运行的。而主流的安卓产品均采用ARM处理器,尽管很早之前,Google的Android NDK就引入了x86编译的选项,但至今还是有相当一部分应用只针对ARM平台进行了编译,这就造成了x86安卓平台兼容性问题。
为了解决这一问题,Intel在推出Android手机系统的ATOM平台之初,就引入了“二进制转换”(Binary Translation)这一功能,来解决x86无法直接运行ARM库的问题。针对ARM编译的二进制代码会被ATOM处理器翻译成x86执行的代码,从而运行包含为ARM编译的原生代码的应用。
通过这一功能,x86 ATOM可以兼容市面上的绝大部分应用。最新的采用Atom Z2580处理器的联想K900已经宣传自己能兼容市场上的TOP 20000应用。
在解决了兼容性问题后,加上x86 Atom单核战双核、双核秒四核的彪悍性能(跑分),x86似乎已毫无黑点,横扫市场指日可待。但遗憾的是,x86所宣传的“兼容”与“性能”,由于目前的生态环境的限制,并不能兼得。
尽管TOP 20000的应用已经可以被兼容,但个人统计了豌豆荚市场中最热门的250个应用,其中31%的应用没有使用原生代码。剩下的69%含有原生代码的应用中,只有8%包含了x86库,剩下61%只有ARM原生库。也就是说,只有这8%的应用,x86可以发挥自己的最佳性能,而绝大部分,都需要进行二进制转换去进行兼容。
通过统计当乐网中最热游戏TOP100,我们发现,只有6%的游戏不含原生库,胜于94%的游戏都含有原生代码。在这其中,只有5%的游戏含有x86原生库,剩余的将近90%的游戏,都需要Atom处理器通过二进制转换运行为ARM编译的代码。
通过实验对比,我们发现:当使用x86原生库时,我们可以发现ATOM的单线程性能异常强悍,特别是内存性能。而一旦采用兼容模式,二进制转换运行ARM库,性能就大大下降。可以看到二进制转换相比原生执行x86代码,损失的性能还是很可观的,在性能诉求的应用中,损失可高达50%以上。在一些游戏类应用中,也会带来约400mW的CPU功耗的增加。
总的来说,x86的Android之路还很漫长,尽管通过Intel和厂商的努力解决了兼容和性能问题,但相对恶劣的生态环境使得性能和兼容不可兼得。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
事实证明,经过我的测试,x86 的应用兼容性已经做的十分完善,英特尔此前宣布可达 95% 的兼容性不假,大家大可放下心里包袱。不过英特尔是如何做到的,这背后的原因很多人并不知道。恰好在 IDF 上,我遇到了一位英特尔软件部门工程师,他向我通俗的讲述了其中的原因。
其实问题主要出在指令集上,x86 使用的是 SSE 指令集,而 ARM 是用的 NEON 指令集,两者差异导致了应用不兼容。不过好在 Android 的大部分应用运行在 Dalvik 虚拟机之上,并不依赖 CPU 架构,因此这些应用可以很好地跑在 x86 上。
支持 Dalvik 的程序占据大多数,但仍然会有一些应用绕过 Dalvik。比如需要更高的性能或者需要硬件的支持的时候,前者通常是大型游戏,后者则是结合了感应器或者电源管理等硬件相关的应用。Angry Bird 两者都不占,所以可以兼容,赛车游戏两者都需要,所以大多不兼容。
这些稍显复杂的应用数量并不低,且用户需求强烈。为了快速解决这些问题,英特尔试图通过技术去完善,开发了一种转换技术“Houdini”。 “Houdini”相当于一个中间层,可以让原本不兼容的应用跑在 x86 上。但这种强行结合的技术运行起来往往效率不高,容易出问题,且会增加 2% 左右的耗电。
从源头解决问题显然是更好的办法,尽管速度会慢一下。自从英特尔和 Android 合作之后,英特尔就提供了 x86 的 NDK。 开发者只需在应用中支持这个 NDK,应用在提交时会自动生成 2 个 app,设备在下载时会根据自己的架构下载合适的 app。这种方法并不难,效果也最好,难的是如何让众多开发商甘愿合作。所以英特尔以及手机厂商会去和应用厂商挨个合作,督促其支持 x86 的 NDK。
现在已经有很多大型游戏支持 x86 架构,包括极品飞车、无尽之剑等。用户大可不必担心,因兼容性引起的影响已经十分微小了。
况且用户日常使用最频繁的恰恰是那些十分简单、无需重新适配的应用。由于 Android 使用虚拟机,应用性能常遭人诟病,但是这样做的好处是,应用可以轻松跨平台运行。如果没有这个,那对英特尔来说将是灾难性的,从这点来看,英特尔还是十分幸运的。