Android 引入第三方so后启动报错 /lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "xxx.so"

本文详细解析了在Android应用中引入不同平台的So文件(如a.so和b.so)时,因缺少特定CPU架构版本导致的闪退问题。深入分析了Android系统加载So文件的机制,阐述了为何在支持arm64-v8a的设备上会出现找不到所需So文件的情况,并提供了在Gradle配置中限制So文件架构的具体解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缘由:

由于项目需要,引用了不同平台的so文件,分别a.so, b.so ,其中a.so 只有armabi-v7a版本,b.so通过gradle配置自动下载,编译运行后程序启动,运行到需要使用a.so 的地方直接闪退;报错:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file xxxxxxxxxxxxxx
  xx.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "xxx.so"
at java.lang.Runtime.loadLibrary(Runtime.java:367)
	at java.lang.System.loadLibrary(System.java:1076)

分析原因:

从AS中build 一个apk出来 解压查看lib目录 发现里面带有除armabi-v7a目录外 还有其他目录,并且每个目录都有b.so,但是没有a.so文件,再看运行的android 设备 是支持arm64-v8a,根据Android 寻找so的机制,可以得到答案,该Android 设备启动时先到系统目录寻找,没找到,再到软件内部lib找,找到与它适配的目录 arm64-v8a ,继续到目录中寻找用到的a.so、b.so文件,然而除了armabi-v7a目录外其他目录都没有a.so文件,于是系统就抛出这个错误,直接闪退;

通过网上比较多的说法,Android Studio 在打包apk时 会自动把支持的所有so版本复制到apk的lib目录下,由于b.so带有各种版本的so文件 ,打包时把b.so的所有版本随同 arm64-v8a 、x86等目录一并复制到lib中,但是由于a.so 只有armabi-v7a 版本,最终导致其他目录不存在a.so ;

可以得出,这种错误会出现在支持armabi-v7a以外的其他cpu架构中;

解决问题

  1. 条件允许的情况下我们可以选择为a.so生成多个版本的文件,但是这样会导致apk文件增大很多;
  2. 在app下的build.gradle中添加如下配置:(推荐)
android {

...
  ndk {
//只保留armeabi-v7a的目录,具体保留那个根据自己需求
            abiFilters "armeabi-v7a"
        }
    }

 

PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/Maps3/arm64-v8a/libapp.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libapp.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libappmetrica_crashpad_handler.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libappmetrica_crashpad_handler.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libappmetrica-native.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libappmetrica-native.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libappmetrica-native-runner.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libappmetrica-native-runner.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libappmetrica-service-native.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libappmetrica-service-native.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libcom.yandex.navikit.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libcom.yandex.navikit.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libcrashlytics.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libcrashlytics.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libcrashlytics-common.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libcrashlytics-common.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libcrashlytics-handler.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libcrashlytics-handler.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libcrashlytics-trampoline.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libcrashlytics-trampoline.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libcrash-watcher.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libcrash-watcher.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libc++_shared.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libc++_shared.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libflutter.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libflutter.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libimage_processing_util_jni.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libimage_processing_util_jni.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libmaps-mobile.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libmaps-mobile.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libquasar_daemons.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libquasar_daemons.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/librsjni.so:$(TARGET_OUT)/app/Maps3/lib/arm64/librsjni.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libRSSupport.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libRSSupport.so \ $(LOCAL_PATH)/Maps3/arm64-v8a/libtoolChecker.so:$(TARGET_OUT)/app/Maps3/lib/arm64/libtoolChecker.so 编译报错error: cannot assign to readonly variable: PRODUCT_COPY_FILES
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值