引入多个第三方包,libc++_shared.so不兼容问题

1,056 阅读4分钟

最近做的项目,需要引入一个第三方sdk进行语音合成。所以在开始做的时候,就先屏蔽了项目中之前的语音包的功能。然后导入第三方包,开始编译,报了如下的错误,图片是从别的博客copy的,因为工程不在这个电脑。

image.png

这个错误的原因是引入了多个都包含了libc++_shared.so的jar包,所以编译器不知道该选择哪个进行编译。然后网上一顿搜索,既然编译器不知道该选择哪一个,那么就告诉编译器选择哪一个,于是就进行了下面的配置,编译运行都OK。(这里工程之前的部分功能被我屏蔽了)

packagingOptions{
        pickFirst 'lib/armeabi/libc++_shared.so'  
    }

接下来就是进行功能的整合了,把我之前先屏蔽的功能都放开,编译非常顺利,只不过程序一直崩溃, 报错信息大致如下:

12-28 10:08:58.384 F/libc    ( 9577): Fatal signal 11 (SIGSEGV), code 0 (SI_USER) in tid 9577 (********), pid 9577 (*******)

******

12-28 10:08:59.547 F/DEBUG   (11198): Build fingerprint: 'OPPO/PEAM00/OP4E6B:12/SP1A.210812.016/Q.202210080444:user/release-keys'
12-28 10:08:59.548 F/DEBUG   (11198): Revision: '0'
12-28 10:08:59.548 F/DEBUG   (11198): ABI: 'arm'
12-28 10:08:59.548 F/DEBUG   (11198): Timestamp: 2022-12-28 10:08:58.606402783+0800
12-28 10:08:59.548 F/DEBUG   (11198): Process uptime: 0s
12-28 10:08:59.548 F/DEBUG   (11198): Cmdline: *******
12-28 10:08:59.548 F/DEBUG   (11198): pid: 9577, tid: 9577, name: *******>>> ******* <<<
12-28 10:08:59.548 F/DEBUG   (11198): uid: 11574
12-28 10:08:59.548 F/DEBUG   (11198): signal 11 (SIGSEGV), code 0 (SI_USER), fault addr --------
12-28 10:08:59.548 F/DEBUG   (11198):     r0  fffffffc  r1  fff96b30  r2  00000010  r3  0000037f
12-28 10:08:59.548 F/DEBUG   (11198):     r4  00000000  r5  00000008  r6  ee4ad110  r7  0000015a
12-28 10:08:59.548 F/DEBUG   (11198):     r8  ee4ad15c  r9  ee4ad110  r10 00000000  r11 0000037f
12-28 10:08:59.548 F/DEBUG   (11198):     ip  fff96ae0  sp  fff96ad0  lr  e91a553d  pc  e91d3e08
12-28 10:08:59.548 F/DEBUG   (11198): backtrace:
12-28 10:08:59.548 F/DEBUG   (11198):       #00 pc 00090e08  /apex/com.android.runtime/lib/bionic/libc.so (__epoll_pwait+20) (BuildId: 31468457402d45f9c2aec801ea9152dd)
12-28 10:08:59.548 F/DEBUG   (11198):       #01 pc 00062539  /apex/com.android.runtime/lib/bionic/libc.so (epoll_wait+16) (BuildId: 31468457402d45f9c2aec801ea9152dd)
12-28 10:08:59.548 F/DEBUG   (11198):       #02 pc 000100a5  /system/lib/libutils.so (android::Looper::pollInner(int)+124) (BuildId: 32b80ccb1972fc1d4674ac2cb7671100)
12-28 10:08:59.548 F/DEBUG   (11198):       #03 pc 0000ffcf  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+62) (BuildId: 32b80ccb1972fc1d4674ac2cb7671100)
12-28 10:08:59.548 F/DEBUG   (11198):       #04 pc 000e1be3  /system/lib/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long long, int)+24) (BuildId: ac5eb70d72ef020bce9c91883d2c5cc8)
12-28 10:08:59.548 F/DEBUG   (11198):       #05 pc 001a22ad  /system/framework/arm/boot-framework.oat (art_jni_trampoline+60) (BuildId: 46403c81c600e240f6c59c29cac13fa086bd1cfe)

意思大概就是我在编译的时候选择的libc++_shared.so和某些jar中的代码不兼容,然后就发生了crash。

首先介绍一下libc++_shared.so: libc++是STL(C++标准模版库)规范的一种实现,Android 5.0及以后版本os便开始使用此STL,更进一步,在ndkr18开始成为唯一可用STL。因此,libc++也是Android官方指定STL。每一个NDK版本都会带有它,在用到它(build.gradle中配置了arguments “-DANDROID_STL=shared”)的时候,就会输出产物中带有libc++_shared.so这个共享库。

总结下来的意思就是我项目依赖的jar包中,至少有两个不同版本的libc++_shared.so。所以解决的方案如下:

1.第三方在打包的时候尽量不要将libc++_shared.so包含进来,这样很容易出现不兼容。(gradle脚本中配置arguments “-DANDROID_STL=none”)

2.删除已有jar中的so文件. 命令如下:zip -d xxx.aar*libc++_shared.so

参考:

blog.csdn.net/qq_32198115…

blog.csdn.net/ixiaoma/art…