# x86 如何解决 Android 应用兼容性问题？

- 作者：王超文
- 发布时间：2013-04-12 08:41
- 分类：公司
- 原文：https://www.ifanr.com/276488

[![intel-inside](https://s3.ifanr.com/wp-content/uploads/2013/04/intel-inside.jpg)](http://www.ifanr.com/276488/intel-inside)

前几日拿到联想 K900，这款机器无论是硬件还是软件都十分不错，工业设计也很强。但很多网友在询问我时仍然关心一个问题，x86 的应用兼容性怎么样？在他们看来，兼容性很大程度上影响他们是否购买这款机器。

事实证明，经过我的[测试](http://www.ifanr.com/274856)，x86 的应用兼容性已经做的十分完善，英特尔此前宣布可达 95% 的兼容性不假，大家大可放下心里包袱。不过英特尔是如何做到的，这背后的原因很多人并不知道。恰好在 IDF 上，我遇到了一位英特尔软件部门工程师，他向我通俗的讲述了其中的原因。

其实问题主要出在指令集上，x86 使用的是 SSE 指令集，而 ARM 是用的 NEON 指令集，两者差异导致了应用不兼容。不过好在 Android 的大部分应用运行在 Dalvik 虚拟机之上，并不依赖 CPU 架构，因此这些应用可以很好地跑在 x86 上。

支持 Dalvik 的程序占据大多数，但仍然会有一些应用绕过 Dalvik。比如需要更高的性能或者需要硬件的支持的时候，前者通常是大型游戏，后者则是结合了感应器或者电源管理等硬件相关的应用。Angry Bird 两者都不占，所以可以兼容，赛车游戏两者都需要，所以大多不兼容。

这些稍显复杂的应用数量并不低，且用户需求强烈。为了快速解决这些问题，英特尔试图通过技术去完善，开发了一种转换技术“Houdini”。“Houdini”相当于一个中间层，可以让原本不兼容的应用跑在 x86 上。但这种强行结合的技术运行起来往往效率不高，容易出问题，且会增加 2% 左右的耗电。

从源头解决问题显然是更好的办法，尽管速度会慢一下。自从英特尔和 Android 合作之后，英特尔就[提供了 x86 的 NDK](http://software.intel.com/en-us/articles/ndk-android#floating-point)。开发者只需在应用中支持这个 NDK，应用在提交时会自动生成 2 个 app，设备在下载时会根据自己的架构下载合适的 app。这种方法并不难，效果也最好，难的是如何让众多开发商甘愿合作。所以英特尔以及手机厂商会去和应用厂商挨个合作，督促其支持 x86 的 NDK。

现在已经有很多大型游戏支持 x86 架构，包括极品飞车、Epic Citadel 等。用户大可不必担心，因兼容性引起的影响已经十分微小了。

况且用户日常使用最频繁的恰恰是那些十分简单、无需重新适配的应用。由于 Android 使用虚拟机，应用性能常遭人诟病，但是这样做的好处是，应用可以轻松跨平台运行。如果没有这个，那对英特尔来说将是灾难性的，从这点来看，英特尔还是十分幸运的。
