Android系统目前支持七种不同的CPU架构
ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的二进制接口。应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。
很多设备都支持多种ABI,有规则选取
比如ARM64和x86设备也可以同时运行armeabi-v7a和armeabi的二进制包同Android包管理器在安装时会自动选择在APK里面为对应系统ABI预编译好的.SO文件。
当对应的lib文件夹目录下面不存在文件时就会按一定的法则来选择。在x86设备上,libs/x86目录中如果存在.so文件的话,会被安装,如果不存在,则会选择armeabi-v7a中的.so文件,如果也不存在,则选择armeabi目录中的.so文件(因为x86设备也支持armeabi-v7a和armeabi)。
所以这里需要注意的一点是:你应该尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。使用高版本编译的.SO文件在低版本设备使用
NDK平台是向后兼容不是向前兼容的所以我们在编译.SO文件的时候尽量在低版本编译然后再高版本使用。
这同样也需要你注意当引入一个预编译好的.so文件时,你需要检查它被编译所用的平台版本。.SO的存放目录
Android Studio工程放在jniLibs/ABI目录中(当然也可以通过在build.gradle文件中的设置jniLibs.srcDir属性自己指定)
Eclipse工程放在libs/ABI目录中(这也是ndk-build命令默认生成.so文件的目录)
AAR压缩包中位于jni/ABI目录中(.so文件会自动包含到引用AAR压缩包的APK中)
最终APK文件中的lib/ABI目录中
通过PackageManager安装后,在小于Android 5.0的系统中,.so文件位于app的nativeLibraryPath目录中;在大于等于Android 5.0的系统中,.so文件位于app的nativeLibraryRootDir/CPU_ARCH目录中。最后再说几条注意的东西:尽量在相同的运行时编译.SO文件;在条件允许的情况下(APK大小适度)提供每个支持的CPU架构对应的.SO文件。
安卓开发.SO文件
最新推荐文章于 2024-09-02 10:14:48 发布