Android CPU架构兼容解密

近期遇到一个so包兼容的问题,困扰了2天,今天终于得到解决,记录一下。

需要了解的知识:

Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。 应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。

所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,如果项目中有x86文件夹,那么x86设备只会拷贝x86文件夹中的so,忽略其他文件夹。如果项目中有armeabi-v7a文件夹,那么v7a设备只会拷贝v7a文件夹中的so。 如果项目中只有armeabi文件夹,那么所有的设备都只会拷贝armeabi中的so。由此可知,项目中只保留armeabi可以实现兼容问题,但这会影响到运行的性能问题,但考虑到现在大部分手机还都是v7手机,而且反编译微信apk后,它们也只提供 armeabi文件夹,兼容问题可以从这出发。

解决思路:

1.目前项目有armeabi的四个so包:main1.so,main2.so,main3.so,main4.so

2.gradle引用第三方sdk, 提供armeabi-v7a,x86两种架构so

3.现在第一步要做得是,过滤出armeabi的so包,可以在application项目的build.gradle中加入

defaultConfig{

ndk{abiFilters "armeabi"}

}

第二步将第三方sdk中的armeabi-v7a中的so拷贝到项目中的aremeabi中。

至此所有的so包都在armeabi中,经过测试,可以正常运行。

你可能感兴趣的:(Android CPU架构兼容解密)