参考
- X86上的Android:性能与兼容可否兼得?
- Androidndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)
- armeabi-v7a armeabi arm64-v8a区别
关键信息摘抄
armeabi-v7a确实是可以兼容armeabi
x86是可以兼容armeabi平台运行的(包括armeabi和armeabi-v7a),同时带来的是性能上的损耗。
通常来说,针对ARM平台编译的二进制代码,x86的处理器是无法直接运行的。为了解决这一问题,Intel在推出Android手机系统的ATOM平台之初,就引入了“二进制转换”(Binary Translation)这一功能,来解决x86无法直接运行ARM库的问题。针对ARM编译的二进制代码会被ATOM处理器翻译成x86执行的代码,从而运行包含为ARM编译的原生代码的应用。
兼容运行ARM库相比原生执行x86代码,成绩下降了30%,平均的CPU占用率从58.9%提高到了73.4%,而平均电流从621mA提高到了717mA,增加了约100mA,相对来说CPU的功耗增加了约400mW。
二进制转换相比原生执行x86代码,损失的性能还是很可观的,在性能诉求的应用中,损失可高达50%以上。在一些游戏类应用中,也会带来约400mW的CPU功耗的增加。
一点结论
目前市面上x86架构的手机非常少,粗看下来最新款的ATOM手机产于2015年Q3,可谓是老机型。
我们游戏通常不考虑支持低端机,故果断舍弃了x86选项。带来的好处是IL2CPP打包的提速,跟包体减小。
另外,很多模拟器还是基于x86的,但模拟器不在我们主要支持的
范围内,只要兼容模式能正常运行就好了。MuMu模拟器,在设置里有是否兼容ARM的选项,需要的时候可以打开。
2020-10-12补充
- 模拟器32位(即Mac处理器的指令集):i386
- 模拟器64位(即Mac处理器的指令集):x86_64
- 真机32位(即ARM处理器的指令集):armv7、armv7s
- 真机64位(即ARM处理器的指令集):arm64(armv8)