Android兼容之libc++_shared.so库冲突方案

news/2024/11/28 23:55:04/

提供解决libc++_shared.so库冲突方案

背景

随着App功能增多,集成的so库也会增多,如果系统中多个so库都使用系统自动生成的libc++_shared.so库,如果不兼容时,会导致某个服务调用时crash

说明
当存在不兼容问题时,app会在掉用服务时,相关页面会停留一小段时间,但是由于so库出现问题,导致crash;可以通过日志查看,里面没有业务的相关代码,只有libc相关信息

--------- beginning of crash
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)

关键字查询:backtrace 或者 beginning of crash

原因:

不同的libc++_shared.so库不兼容。怎么产生的不兼容呢?libc++_shared.so是c++的标准模板库,从ndk18开始成为android唯一支持的标准模板库。每一个NDK版本都会带有它,在用到它(build.gradle中配置了arguments “-DANDROID_STL=shared”)的时候,就会输出产物中带有libc++_shared.so这个共享库;它源自NDK的目录中,可以从c++的build log中发现路径,
请添加图片描述

"stlSharedObjectMap": {"LIBCXX_SHARED": {"ARMEABI_V7A": "/Users/dxm/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so","ARM64_V8A": "/Users/dxm/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so","X86": "/Users/dxm/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so","X86_64": "/Users/dxm/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so"},"LIBCXX_STATIC": {},"NONE": {},"SYSTEM": {}}
  1. 每个NDK版本中的libc++_shared.so可能都有变化,前后版本不一定完全兼容。
  2. 另外libc++_shared.so是经过strip的,最后包含的符号表也不相同。
  3. stl库有四种包含方式 none|system|shared|static.
    这几个原因导致最后的so文件会不兼容。

方案

1、充分沟通协调,所有的提供方都遵循相同的规则,使用统一的ndk版本,最终达到一致。这个方案很彻底,但成本很高,对不同的场合也不一定都实用。
2、作为sdk的提供方(业务提供方),我们管不了别人,管自己是可以的,我们不出问题,确保我们提供的so不会有冲突也是一种方法。

SDK采用第二种方法也可以,具体方法如下:
1、在我们的c++代码中不要使用stl库中的东西,比如std:map等。
2、在c++代码中不要使用new/delete生成和释放对象,取而代之的是malloc(calloc/realloc)/free来管理对象。
3、在gradle脚本中配置arguments “-DANDROID_STL=none”
这样我们生成的产物就不带有libc++_shared.so文件了,
另外建议: 多次尝试兼容,如果不行就让某个业务so库包含libc++_shared.so

参考文档:C++库支持


http://www.ppmy.cn/news/241518.html

相关文章

springboot项目外卖管理 day02-新增员工以及员工信息编辑

文章目录 一、新增员工1.1、需求分析1.2、数据模型1.3、代码开发 二、员工信息分页查询2.1、需求分析 2.2、代码开发2.3、分页插件2.4、员工信息分页查询 三、启用/禁用员工账号3.1、需求分析3.2、代码开发3.3、根据id修改员工信息3.4、代码修复 4、编辑员工信息4.1、功能需求4…

第十四届蓝桥杯大赛软件赛省赛(C/C++ 研究生组)

蓝桥杯 2023年省赛真题 C/C 大学G组 试题 A: 工作时长  试题 B: 与或异或  试题 C: 翻转  试题 D: 阶乘的和  试题 E: 公因数匹配  试题 F: 奇怪的数  试题 G: 太阳  试题 H: 子树的大小  试题 I: 高塔  试题 J: 反异或 01 串 除去第 F \rm F F 题&#xff0c;其他题…

Java教程【01.02】Java引用类型数组和继承的意义

Java引用类型数组和继承的意义 Java引用类型数组和继承是Java中常用的两个概念,它们在编程中起到重要的作用。在本教程中,我们将讨论Java引用类型数组的使用以及继承的意义,并提供相关的示例。 步骤1:创建引用类型数组 Java中的引用类型数组允许我们在单个变量中存储多个…

RSSI 异常分类

2.2.1 工程质量不好导致 RSSI 异常 指工程质量不好引起的 RSSI 异常&#xff0c;比如接头制作不符合规范和接头松动等原因导致主 集或分集产生自激、天线进水、设备老化等都会引起 RSSI 值异常。 由自激产生的 RSSI 异常通常表现为主集或分集过大、主分集差值过大。在已发…

win10 高内存、CPU占用(接近百分之百)

问题描述&#xff1a; 1. 电脑内存8g&#xff0c;CPU为 i5 6300HQ 2. 有时用着用着电脑的内存cpu就占用的90%以上。打开任务管理器&#xff0c;有个system进程经常CPU占用约30% 3. 开机有时占用会降下来&#xff0c;有时有cpu、内存一直接近100%的占用&#xff0c;而且不会随着…

CPU锁频率在0.78 GHz

文章目录 问题解决办法 问题 我笔记本最近容易锁频率&#xff0c;CPU型号为&#xff1a;i5-6300HQ&#xff0c;很迷幻… 解决办法 **拔电源&#xff01;&#xff01;**重新查一下试试&#xff08;我是这样就好使了&#xff0c;不知道是机缘还是巧合呢&#xff09;重启&…

centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息

https://www.cnblogs.com/zy-plan/p/8617202.html 1.系统 1.1版本 uname -a 能确认是64位还是32位&#xff0c;其它的信息不多 [rootlocalhost ~]# uname -a Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 G…

基于PCA降维的模式识别系统的设计与实现

基于PCA降维的模式识别系统的设计与实现 1.1 主要研究内容 (1)工作的主要描述 本次作业的主要目的是结合课内课外所学知识设计一个简单的模式识别系统对电离层公开数据进行分类、通过主成分分析(PCA)特征提取方法探索降维对分类性能的影响并学习一些常见分类器的基本原理…