大家好,又见面了,我是你们的朋友全栈君。
Android 系统本质是一个经过改造的 Linux 系统,so库是Linux系统上使用的共享库(类似windows上的dll)。最早,Android 系统只支持 ARMv5 的 CPU 构架,随着 Android 系统的发展,又加入了 ARMv7 (2010), x86 (2011), MIPS (2012), ARMv8, MIPS64 和 x86_64 (2014)。每一种 CPU 构架,都定义了一种 ABI(Application Binary Interface),ABI 决定了二进制文件如何与系统进行交互。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfB5m8yJ-1592650237349)(https://upload-images.jianshu.io/upload_images/6169789-ea3357514e3dc870.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
下面样例表示支持armeabi、armeabi-v7a和arm64-v8a
defaultConfig {
ndk {
abiFilters 'armeabi','armeabi-v7a','arm64-v8a'
}
}
其实这个可以不设置,这样编译时,就会将项目里所有依赖资源包里的so库都打到最终的apk里。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWncJqkm-1592650237351)(https://upload-images.jianshu.io/upload_images/6169789-f9f74c59aef798ba.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)] 但是有些平台,我们是不需要支持的,如果不删除的话,apk就臃肿了。如果那些so库是我们自己编译出来的,那可以直接在工程中删除对应so文件,但是如果是第三方提供的,就不好删除了,所以就需要使用abiFilters来过滤了。
如果需要针对不同的平台出不同的包,可以在productFlavors里进行设置,可参考文章:https://blog.csdn.net/hknock/article/details/76034125
看上上面的描述,以为新增一个so库文件可以随便根据需要适配的目录放,就错了。如果你有库文件在armeabi里有,但是armeabi-v7a目录下没有,那么运行在V7a的架构时,就会出现找不到so库文件的情况。具体描述参照:Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143549.html原文链接:https://javaforall.cn