确保项目中只包含一个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。