x86架构的android手机兼容性问题
x86架构的android手机兼容性问题
http://www.cnblogs.com/guoxiaoqian/p/3984934.html
自从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 使用虚拟机,应用性能常遭人诟病,但是这样做的好处是,应用可以轻松跨平台运行。如果没有这个,那对英特尔来说将是灾难性的,从这点来看,英特尔还是十分幸运的。
x86架构的android手机兼容性问题的更多相关文章
- x86架构手机跑安卓好吗?(脑补)
华硕低价位手机ZenFone一推出就掀起市场话题,许多人也对ZenFone所采用的Intel Atom处理器有所意见,深怕其相容性问题无法正确执行应用程式App,这究竟是怎么回事呢? Intel近几年 ...
- GPS部标平台的架构设计(六)-Android手机客户端和手机查车设计
对于GPS软件平台,虽然有功能非常丰富的PC端或BS客户端,但是客户也是需要移动客户端来作为自己的辅助工具,也是需要的.做为GPS平台的设计者和开发者,在开发移动客户端的时候,也需要从常规的服务器开发 ...
- ARM与X86架构的对决[整编]
CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法.早期的CPU全部是CISC架构,它的设计目的是 CISC要用最少的机器语言 ...
- [转]设置Android手机以使用ARM Streamline进行性能分析(一)
本博客第一次转载的文章,原文访问不到了,这篇是从google cache里挖出来的,为有需要的同学准备.原文地址 Posted by Fang Bao,(鲍方) 4 Comments 11 J ...
- X86 架构和 ARM 架构
1.关于x86架构 X86是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合,X86是由Intel推出的一种复杂指令集,用于控制芯片的运行的程序,现在X86已经广泛运用到了家 ...
- ARM架构和X86架构对比
转载地址 我们就ARM架构的系统与X86架构系统的特性进行一个系统分析,方便用户在选择系统时进行理性.合理的比价分析. 一.性能: X86结构的电脑无论如何都比ARM结构的系统在性能方面要快得多.强得 ...
- Android手机控制电脑撸出HelloWorld
最近在开发一个远程办公的软件. 昨天在手机调通,并且成功通过手机打开电脑上的Eclipse撸出来一个HelloWorld. 也许不久的将来, 下班后,拿着手机在家写代码了.工作时间直接变成24/24 ...
- 为什么iphone手机比android手机流畅
作为当下最流行.市场占用份额最大的两大手机操作系统IOS和android,目前两者加起来的市场占用率达到90%.我曾经一直用android手机,没有用过iphone,那时候正直iphone4和ipho ...
- 以C#编写的Socket服务器的Android手机聊天室Demo
内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.WCF这些具有双向通信的协议或 ...
随机推荐
- 剑指Offer 顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- tornado + supervisor + nginx 的一点记录
看了比较多的blog基本都是这个架构: supervisor ------------ app1 |-------app2 |-------.... |-------appn |-------ngin ...
- Java语言中几个常用的包
Java采用包结构来组织和管理类和接口文件.本文介绍Java语言类库中几个常用的包,因为这几个包在软件开发与应用中经常需要用到,其中有些包是必要的.若是离开它,还真不能做事情了. 第一个包:java. ...
- ubuntu14.04 163sources.list
deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.163 ...
- 【leetcode】N-Queens
N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...
- volley post非json格式数据并获取json数据
在使用JsonObjectRequest时无法post非json格式的数据,因而采用StringRequest获取到相应的数据后再转为json格式的数据. //这里的上下文需要讨论 private s ...
- redis pub/sub 实战: 微信语音识别
2015年5月22日 20:20:20 星期五 效果: 这边对微信说话, 浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...
- HBase集成Zookeeper集群部署
大数据集群为了保证故障转移,一般通过zookeeper来整体协调管理,当节点数大于等于6个时推荐使用,接下来描述一下Hbase集群部署在zookeeper上的过程: 安装Hbase之前首先系统应该做通 ...
- NoSQL之【MongoDB】学习(二):DML和查询操作说明
摘要: 操作MongoDB的方法和关系型数据库差别很大,现在对他们进行说明,后期会逐步完善. ##开头表示MySQL** 开头表示MongoDB 创建: Mongodb:文档数据库,擅长存非结构化数据 ...
- SQL Server 2008登录错误:无法连接到(local)的解决方法
1.服务器类型我们选择了“数据库引擎”时,查找里面的可登录用户名是没有的,下边的服务器名称只显示为“(local)”,连“Windows 身份验证”都无法登录. 如果朋友们和我出错的问题是一样请看下面 ...