融云IM干货丨如何确保在项目中只包含一个libc++_shared.so版本?

程序员小五
• 阅读 865

确保项目中只包含一个libc++_shared.so版本的关键在于统一C++运行时,并合理配置项目的构建脚本。以下是一些具体的步骤和方法:

统一NDK版本:确保项目中所有模块使用的NDK版本一致,这有助于避免不同版本NDK生成的libc++_shared.so之间的冲突。可以在module级别的build.gradle文件中添加NDK版本约束,例如:

gradle ndkVersion "21.0.6113669" 这样可以保证C++运行时版本的一致性 。

发布AAR时排除libc++_shared.so:在发布AAR时,可以在packagingOptions中排除libc++_shared.so,避免将这个库包含在AAR包中,从而减少冲突的可能性:

gradle packagingOptions { exclude '**/libc++_shared.so' }

专门发布包含libc++_shared.so的AAR:可以创建一个专门的AAR,其中包含libc++_shared.so,供其他模块依赖,这样可以确保只有一个版本的libc++_shared.so被打包到APK中 。

在主项目中指定libc++_shared.so:在主项目的build.gradle中使用packagingOptions来指定libc++_shared.so,使用pickFirst策略来选择第一个找到的libc++_shared.so:

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

使用Gradle Dependency Analyzer:Android Studio提供了Gradle Dependency Analyzer工具,可以帮助分析项目的依赖关系,识别哪些库包含了libc++_shared.so。通过这个工具,可以更直观地看到哪些模块或库可能导致了重复包含的问题,并进行相应的调整 。

避免使用STL库中的内容:在C++代码中避免使用STL库中的内容,比如std::map等,并且不使用new/delete生成和释放对象,改用malloc(calloc/realloc)/free来管理对象。在Gradle脚本中配置-DANDROID_STL=none,这样生成的产物就不带有libc++_shared.so文件了 。

静态链接C++ STL库文件:修正C++项目的构建脚本,屏蔽掉链接C++ STL动态库的指令,并在项目中的Java代码中去掉加载动态库c++_shared的代码,确保链接C++ STL的静态库文件 。

通过上述方法,可以有效地管理和控制项目中libc++_shared.so的版本,确保项目中只包含一个版本的libc++_shared.so。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
9个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
Linux应急响应(二):捕捉短连接
0x00前言​短连接(shortconnnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。在系统维护中,一般很难去察觉,需要借助网络安全设备或者抓包分析,才能够去发现。0x01应急场景​
程序员小五 程序员小五
11个月前
融云IM干货丨如何测试升级后的IMKit版本是否稳定?
测试升级后的IMKit版本是否稳定,可以遵循以下步骤和建议:确保使用最新版本的SDK:始终使用融云提供的最新的SDK版本,以确保所有已知的兼容性问题都已经被修复。测试不同操作系统版本:如果可能,测试应用在不同版本的操作系统上的表现,特别是最新版本的操作系统
程序员小五 程序员小五
11个月前
融云IM干货丨Libc++_shared.so 标准库常见问题处理方案
​针对libcshared.so标准库的常见问题,以下是一些处理方案:在build.gradle中添加去重代码,以确保不会重复包含libcshared.so文件。例如:packagingOptionspickFirst('lib/armeabiv7
程序员小五 程序员小五
11个月前
融云IM干货丨如何检测项目中是否重复包含libc++_shared.so?
​检测项目中是否重复包含libcshared.so可以通过以下几个步骤进行:androidpackagingOptionspickFirst'lib/armeabiv7a/libcshared.so'pickFirst'lib/arm64v8a/l
程序员小五 程序员小五
11个月前
融云IM干货丨 IMKit 升级过程中遇到兼容性问题怎么办?
在升级IMKitSDK过程中遇到兼容性问题时,可以采取以下措施来解决:检查新版本的变更日志:确保检查新版本的变更日志,了解有哪些API变更、功能差异以及安全机制的更新,并测试所有功能以确保兼容性。运行时判断系统版本:在应用运行时判断当前系统版本,并根据版本