您的位置:首页 > 其它

Device supports x86, but APK only supports armeabi-v7a

2017-02-16 11:27 555 查看
今天遇到一根蛋疼的问题,使用之前Genymotion刚出来的时候用了一段时间,后来就一直用真机测试,基本没有打开过模拟器了,就在昨天手机悲催的罢工了,就安装了一个模拟器,改好代码,就在我满心欢喜的点击运行的时候。却提示 Device supports x86, but APK only supports armeabi-v7a,这个问题之前同事好像就遇到过,但是当时忙也就没有去解决,同事好像也没有解决,由模拟器换成真机测试了,     今天详细看来一下,就搜索看有没有跟我遇到一样的问题的,发现还真有,但是都是说的不明不白的,也没有具体的解决方案,直到看来一篇文章 http://blog.csdn.net/u011688880/article/details/46984547(感谢博主,感谢分享)

1.Android设备如何加载.so文件? 

不同CPU架构的Android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;如果没有对应的目录,就会去armeabi下去寻找,如果已经有对应的目录,但是如果没有找到对应的.so文件,也不会去armeabi下去寻找了。 

以x86设备为例,x86设备会在项目中的 libs文件夹寻找是否含有x86文件夹,如果含有x86文件夹,则默认为该项目有x86对应的so可运行文件,只有x86文件夹而文件夹下没有so,程序运行也是会出现find library returned null的错误的;如果工程本身不含有x86文件夹,则会寻找armeabi或者armeabi-v7a文件夹,兼容运行。以armeabi-v7a设备为例,该Android设备当然优先寻找libs目录下的armeabi-v7a文件夹,同样,如果只有armeabi-v7a文件夹而没有
so也是会报错的;如果找不到armeabi-v7a文件夹,则寻找armeabi文件夹,兼容运行该文件夹下的so,但是不能兼容运行x86的so。所以项目中如果只含有x86的so,在armeabi和armeabi-v7a也是无法运行的。以上就是不同CPU架构运行时加载so的策略。

2.对于不同的平台,我们应该怎么去进行适配? 

目前主流的Android设备肯定是armeabi-v7a架构的,然后就是x86和armeabi了。如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,但是同时也会导致包变大。 

armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是armeabi-v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi下了。x86也是可以兼容armeabi平台运行的,另外需要指出的是,打出包的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。

3.如果第三方没有提供对应平台的.so文件怎么办? 

有一些第三方的类库只提供了armeabi下的.so文件,如果我们项目里适配了armeabi-v7a和x86,如果不在对应的文件下放对应的.so文件,就可能导致某些Android设备会出一些问题,我们可以复制armeabi下得.so文件到不同的文件夹下。如果第三方提供了不同平台的.so文件,则复制不同平台的.so文件到项目中对应的文件夹下即可。

然后去看我的工程,发现就只有armeabi-v7a

然后看来一下gragle中发现就是支持armeabi-v7a,没有x86,自己手动加入一行x86,然后就走安装程序了,(但肯定是安装不了)

然后查了一下看到 android中libs目录下armeabi和armeabi-v7a的区别

armeabi默认选项,
支持基于 ARM* v5TE 的设备
支持软浮点运算(不支持硬件辅助的浮点计算)
支持所有 ARM* 设备

armeabi-v7a
支持基于 ARM* v7 的设备
支持硬件 FPU 指令
支持硬件浮点运算

不同手机由于cpu的不同,使用不同的驱动。
ABI:指应用基于哪种指令集来进行编译,ABI总共有四种,分别是armeabi、armeabi-v7a、mips、x86,它们都是表示cpu的类型。

又看一篇文章http://tieba.baidu.com/p/3981043951(文章中说的增加
armeabi  x86 的文件夹,然后copy一份过去我没有试,就算能成功,这种方式肯定也是不行的,包得多大啊,我们的需求只要解决支持模拟器运行就行了)

发现需要
Genymotion-ARM-Translation_v1.1.zip
然后就直接把这个zip下载到桌面,然后直接拖入到模拟器中,然后重启模拟器就OK了
下载地址:http://pan.baidu.com/s/1sl73HE1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐