如果一个android项目在gralde引入某个库之后就报类似下面的错误,找不到so库
AndroidRuntime: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.test.hello-1/base.apk"],nativeLibraryDirectories=[/data/app/com.duolebo.bylshop-1/lib/arm, /data/app/com.test.hello-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]] couldn't find "libtest.so"
会是什么原因造成的呢?这个你去解压一下apk文件,然后去lib目录下对照一下各个cpu架构的so就知道了,肯定是so有差异,其实就是arm cpu向下兼容导致的,本来你的项目有一个自己的so库但是只有armeabi或者其他任意一个,在gradle引入的某个库包含so库,如果你没过滤那么其他架构的so文件会全部打包到apk文件里去,这时候比如一个android 8的新手机,一看有arm64-v8的目录就去这下面装载so,但是你自己的so库没有这个指令集的,所以就会报错,因此解决这个问题你只需要在gradle文件的defaultConfig添加类型如下配置就行了,多个可以用逗号分开
ndk {
abiFilters 'armeabi'
}
这里再提一下so的配置选择, 如果引入so是与性能相关的,比如视频解码一类,那各个架构都引入比较好,自己的so库build全部架构版本,否则只引入armeabi就行了,能够兼容除了x86的外的设备,x86的也很少见,另外还能减少apk体积,当然如果你不考虑老的设备,直接配置armeabi-v7a也行比如android版本的vlc就是这样的
我要评论