Android 开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)
2016-03-24 16:09
1291 查看
作者:Insomnia
欢迎转载,如果说的有问题,感谢指出,及时更正。谢谢
null的错误,因为某种原因,so没有打包到apk中。下面浅析下引起该错误的原因以及平台兼容性问题。
null的错误时,其实最直接的解决办法就是解压apk,看看apk中的x86、armeabi、armeabi-v7a文件夹中是否有对应的so,此时你可能在对应的文件夹下发现少了so,然后再去查原因即可。
一般有两方面的原因:
apk中有对应平台的文件夹,但是文件夹里却没有对应的so。
举个例子,apk中lib下面一旦出现x86文件夹,程序运行的时候就会去加载x86对应的库,但是如果此时x86文件夹没有将so放进来,则会遇到报错。
第三方对平台的兼容策略与自己不一致。
可能第三方选择了只支持armeabi(假设某支付sdk),但是我们的游戏在Application.mk中配置了APP_ABI := all,如此,我们的游戏打包出 了所有平台的so,但是第三方却只有armeabi文件夹对应的so,造成程序运行异常,这种情况在开发期间最常见,一些小公司由于测试人员不足或者测试设备不足,上线后才发现这个问题也不奇怪。
如果项目只包含了 armeabi,那么在所有Android设备都可以运行; 如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行; 如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的; 如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
欢迎转载,如果说的有问题,感谢指出,及时更正。谢谢
引言:
很多朋友在开发Android JNI的的时候,会遇到findlibrary returnednull的错误,因为某种原因,so没有打包到apk中。下面浅析下引起该错误的原因以及平台兼容性问题。
一、没有将so打包到apk中的原因:
当你发现到findlibrary returnednull的错误时,其实最直接的解决办法就是解压apk,看看apk中的x86、armeabi、armeabi-v7a文件夹中是否有对应的so,此时你可能在对应的文件夹下发现少了so,然后再去查原因即可。
一般有两方面的原因:
apk中有对应平台的文件夹,但是文件夹里却没有对应的so。
举个例子,apk中lib下面一旦出现x86文件夹,程序运行的时候就会去加载x86对应的库,但是如果此时x86文件夹没有将so放进来,则会遇到报错。
第三方对平台的兼容策略与自己不一致。
可能第三方选择了只支持armeabi(假设某支付sdk),但是我们的游戏在Application.mk中配置了APP_ABI := all,如此,我们的游戏打包出 了所有平台的so,但是第三方却只有armeabi文件夹对应的so,造成程序运行异常,这种情况在开发期间最常见,一些小公司由于测试人员不足或者测试设备不足,上线后才发现这个问题也不奇怪。
二、对于平台的支持,我们应该如何选择:
armeabi-v7a确实是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi。 x86是可以兼容armeabi平台运行的,无论是armeabi-v7a还是armeabi,同时带来的也是性能上的损耗,另外需要指出的是,打包出的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。具体会有怎样的性能损耗,作者还不能说的非常清楚,可以访问下intel官方在csdn的博客。 总结一下在项目中的表现就是:如果项目只包含了 armeabi,那么在所有Android设备都可以运行; 如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行; 如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的; 如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
结束语:
本人也曾试过将arm-v7a直接复制到arm-v8a,貌似是支持arm64位的(当时测的机型是redmi note 3)。不过还是自己测的比较准确。相关文章推荐
- X86上的Android:性能与兼容可否兼得?
- android view 的测量过程
- Android官方开发文档Training系列课程中文版:支持不同的设备之支持不同的平台版本
- android:launcherMode
- (4.1.37.1)Android 自定义View (二) 进阶
- (4.1.37) Android 自定义View (一)
- Android相机(摄像头)圆形预览窗口,圆形SurfaceView
- Android LayoutInflater & Theme
- Android开发之单例模式
- Android 通过JNI实现守护进程,使Service服务不被杀死
- 【Android】5、详解项目中的资源
- Android推送 百度云推送
- android classloader dex odex
- Android中的设计模式--适配器模式
- android 日常混淆
- Android开发之XML的创建和解析
- Android项目框架搭建 (分析需求、整理资料)
- Android实现QQ空间沉浸式状态栏,并且滑动ListView实现透明度变化
- Android的事件处理
- Android中MediaMuxer和MediaCodec用例 - audio+video