项目组提供了一个AAR文件供下游业务团队集成。
某天,下游团队反馈了一个紧急的问题,最终客户的开发者使用Android Studio打包时,构建工具提示构建失败,原因是存在重复的c++_shared库文件,建议使用pickFirst
命令来修复。
最终客户的开发者查阅了一些资料,按照帖子的建议,在项目对应的build.gradle
文件中尝试增加pickFirst
相关的指令后,问题依然存在,构建仍然失败。
检查我们项目提供的AAR包,确实存在libc++_shared.so
文件,据下游团队和最终客户的开发者反馈,他们的项目中依赖的其它AAR,也都存在libc++_shared.so
文件。
使用C++编写代码时,通常都会使用到STL,NDK针对各平台,分别提供了动态库和静态库版本,即libc++_shared.so
和``libc++_static.a。 安卓官网推荐开发者在
build.gradle中通过指定变量
ANDROID_STL的值来决定使用动态库还是静态库,即在
build.gradle`中,增加类似如下配置:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
...
// 使用静态库
arguments "-DANDROID_STL=c++_static"
// 或者使用动态库
arguments "-DANDROID_STL=c++_shared"
...
}
}
...
}
...
}
经过咨询部门内其它产品的同事,确认本问题最简洁有效的修复方案即在构建时,静态链接C++ STL的库文件。
最终的修复操作如下:
- 修正C++项目的构建脚本,屏蔽掉链接C++ STL动态库的指令。
- 修正项目中的Java代码,去掉加载动态库
c++_shared
的代码。 - 修正AAR的构建脚本,指定链接C++ STL的静态库文件。
经过上述修复操作,重新构建AAR包。检查该AAR文件,未找到libc++_shared.so
文件。
相关文件提供给下游团队,并提供给最终客户的开发者集成后,报错现象消失,通过Android Studio打包构建成功,相关功能经验证,正常可用,问题得到解决。
参考资料
- Android 引用三方库导致 so 库冲突的解决办法
- Android Studio build.gradle 中配置 cmake,及各 arguments 详解
- Android开发之引用三方库导致SO库冲突的解决办法