解决安卓32位so兼容问题

本人遇到的问题为:AndroidStudio更新到最新版本,Gradle插件什么的都更新到了最新版本,运行项目,发现找不到so文件,根据异常信息提示,它是去64位的文件夹里去找so了,这肯定找不到啊,因为我项目的so是32位的,64位的手机不是兼容32位的嘛,而且之前项目运行也好好的,怎么更新开发工具之后出问题了呢?百度里找到了解决方案,但是只说怎么解决,没说原因,为什么会这样?最后还是在Android的官方文档中找到了答案,这里将我自己的理解记录一下。

官方文档:支持64位架构,官方文档的一段描述如下:

从2019年8月1日开始,您在Google Play上发布的应用将需要支持64位架构。64位CPU为您的用户提供更快,更丰富的体验。添加应用程序的64位版本可改善性能,为将来的创新打下基础,并为使用仅64位硬件的设备做好准备。

根据上面这段描述,从2019年8月1日开始,我们的应用必须要支持64位架构,否则就不能上传到GooglePlay,好强的强制性啊,所以当我把AndroidStudio更新到最新版本后,使用AndroidStudio直接运行app时,它能知道我们连接的手机是64位的,所以只打包64位的so到apk,然后我项目中并没有64位的so,所以运行的时候就报找不到so的问题了。

  • 对于ARM系统架构,armeabi、armeabi-v7a属于32位,对应的64位为arm64-v8a。
  • 对于x86系统架构,x86属于32位,对应的64位为x86_64。

既然新版本的AS在运行app时默认只打包64位的,那我们只要修改配置文件,让其打包时使用32位的即可,在模块下的build.gradle中增加如下配置:

    defaultConfig {
  		。。。
        ndk.abiFilters "armeabi"
    }

如果同时有多种so,则可以用逗号隔开写多个,如下:

    defaultConfig {
  		。。。
        ndk.abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
    }

需要注意的是,如果你同时有32位和64位,则必须每一个32位的so都必须要有对应的64位so,否则的话,当你的程序运行到64位的设备中时,因为你的app有64位so的文件夹,则系统只会在64位文件夹中查找so,不会再去32位的文件夹中查找so,此时就会报找不到so异常。解决方案就是所有32位的都生成对应64位的,这种情况有时候无法实现,比如你使用了第三方的so只提供32位的,这种情况的解决方案就是删除所有的64位就可以了,因为系统是向下兼容的。64位手机会先从64位文件夹中找so,如果存在这个文件夹,则所有so都从64位文件夹里面找,如果不存在64位的文件夹,则再去32位的文件夹中找。

猜你喜欢

转载自blog.csdn.net/android_cai_niao/article/details/105772809