问题
- Unity 在Android x86 设备上启动时崩溃。记录显示libhoudini.so出现异常。
原因
libhoudini是一个针对配备x86处理器的Android设备的专有ARM翻译层. 如果一个应用程序拥有NDK编译的ARM二进制代码,却没有对应的x86二进制代码,libhoudini可以使其依旧在x86设备上运行,但是运行速度不能企及原生x86代码。
如果libhoudini可以翻译一切二进制代码,程序将不会有任何运行问题。但是随着Unity不断的更新,添加更多的新功能后,libhoudini不再能够翻译所有的二进制代码 ,从而导致ARM程序在x86设备运行时崩溃。
解决方案
可以在“Android播放器设置”里修改“设备过滤器”选项来解决问题。
如果“设备过滤器”内选定的是“FAT (ARMv7+x86)”,生成的二进制文件将会有两倍大小,而游戏素材不受影响。另外的办法是分别生成x86和ARM的APK,并在Play商店提交应用时一并上传。详情参考Android开发者网站:http://developer.android.com/intl/zh-cn/google/play/publishing/multiple-apks.html
需要注意的一点是:在x86上使用FAT APK时,所有的原生插件(*.so)都需要有ARM和x86两个版本。否则,在x86的库个数小于ARM库的个数时,Android系统会在模拟器上使用ARM而不是x86。
更多信息
http://docs.unity3d.com/Manual/class-PlayerSettingsAndroid.html