如何处理同时集成 RTM SDK 和 RTC SDK 遇到库冲突问题?
问题描述
如果你通过 CDN 直接下载并同时集成 4.5.0 或以上版本的 RTC SDK 和 2.2.0 或以上版本的 RTM SDK,IDE 中可能出现如下报错:
-
Android:
Shellcom.android.builder.merge.DuplicateRelativeFileException: More than one file was found with OS independent path 'lib/x86/libaosl.so'
-
iOS/macOS:
ShellUnexpected duplicate tasks:
Multiple commands produce '<your_app_build_path>/Contents/Frameworks/aosl.framework'ShellThe 'XXX' target has duplicate frameworks with the name 'aosl.xcframework'
问题原因
4.5.0 及以上版本的 RTC SDK 和 2.2.0 及以上的 RTM SDK 都用到了一个相同的库:
- Android:
libaosl.so
- iOS/macOS:
aosl.xcframework
- Windows:
libaosl.dll
所以 IDE 在构建过程中会提示存在多个具有相同路径的文件。
解决方案
1. 明确库的版本
比较 RTC 和 RTM aosl
库的版本信息,保留版本较高的库文件。版本信息见 RTC 发版说明和 RTM 发版说明。
2. 删除版本较低的库
确认库的版本信息后,删除 RTC 或 RTM SDK 包中版本较低的库文件,然后再重新构建项目。
- RTC SDK
- RTM SDK
如果你的项目中 RTC SDK 包中的 aosl
库版本较低,你可以根据目标平台来删除 SDK 包中的 aosl
库文件:
- Android 平台:删除 SDK 包中版本较低的
libaosl.so
文件。 - iOS/macOS 平台:删除 SDK 包中版本较低的
aosl.xcframework
文件。 - Windows 平台:删除 SDK 包中版本较低的
libaosl.dll
文件。
如果你的项目中 RTM SDK 包中的 aosl
库版本较低,你可以选择下列任意一种方式来操作:
方案一:升级 RTM SDK 版本并集成轻量库
如果你使用的 RTM SDK 版本低于 2.2.2,我们推荐你将 RTM SDK 升级至 2.2.2 或以上版本。从 2.2.2 开始 RTM SDK 支持 subspec
(iOS)和轻量级 maven 仓库(Android),通过如下方式升级 SDK 版本即可解决库冲突问题:
-
通过 Maven 或 CocoaPods 升级版本并集成轻量库
-
Java SDK:
Groovy// ...
dependencies {
// 如果你使用的是 2.2.2 或之后版本的 RTM SDK,且项目中同时使用了 RTC SDK v4.5.0 或以上版本
// 将 x.y.z 替换为具体的 SDK 版本号,如 2.2.2
// 可通过发版说明获取最新版本号
implementation 'io.agora:agora-rtm-lite:x.y.z'
} -
Objective-C SDK:
Rubyplatform :ios, '11.0'
target 'Your App' do
# 如果你使用的是 2.2.2 或之后版本的 RTM SDK,且项目中同时使用了 RTC SDK v4.5.0 或以上版本
# 将 x.y.z 替换为具体的 SDK 版本号,如 2.2.0
# 可通过发版说明获取最新版本号
pod 'AgoraRtm', 'x.y.z', :subspecs => ['RtmKit']
end
-
-
清理并重新构建项目。
方案二:手动删除重复文件
如果你使用的是 2.22.2 之前的版本,可以参考如下解决方案。
-
Java SDK:
根据你的集成方式,在下方选择对应的解决方案:
- 使用 CDN
- 使用 Maven
- 在 SDK 包中手动删除如下文件:
-
lib/x86/libaosl.so
-
lib/x86_64/libaosl.so
-
lib/armeabi-v7a/libaosl.so
-
lib/arm64-v8a/libaosl.so
- 重新构建项目。
-
在
build.gradle
文件的android
节点中添加packagingOptions
节点,指定在构建过程中优先选择第一个匹配的文件:Groovyandroid {
// ...
packagingOptions {
pickFirst 'lib/x86/libaosl.so'
pickFirst 'lib/x86_64/libaosl.so'
pickFirst 'lib/armeabi-v7a/libaosl.so'
pickFirst 'lib/arm64-v8a/libaosl.so'
}
} -
Gradle 文件同步完成后,重新构建项目。
-
Objective-C SDK
根据你的集成方式,在下方选择对应的解决方案:
- 使用 CDN
- 使用 Cocoapods
- 在 SDK 包中手动删除
libs/aosl.xcframework
文件。 - 重新构建项目。
-
在项目的
Podfile
末尾添加如下脚本:Rubypre_install do |installer|
# 定义 AgoraRtm framework 的路径
rtm_pod_path = File.join(installer.sandbox.root, 'AgoraRtm')
# aosl.xcframework 的完整路径
aosl_xcframework_path = File.join(rtm_pod_path, 'aosl.xcframework')
# 检查文件是否存在,如果存在则删除
if File.exist?(aosl_xcframework_path)
puts "Deleting aosl.xcframework from #{aosl_xcframework_path}"
FileUtils.rm_rf(aosl_xcframework_path)
else
puts "aosl.xcframework not found, skipping deletion."
end
end -
运行
pod install
重新集成 RTM 和 RTC SDK。 -
重新构建项目。
-
Flutter SDK
根据你的目标平台,在下方选择对应的解决方案:
- Android
- iOS
-
通过 Maven 方式集成时,在
build.gradle
文件的android
节点中添加packagingOptions
节点,指定在构建过程中优先选择第一个匹配的文件:Groovyandroid {
// ...
packagingOptions {
pickFirst 'lib/x86/libaosl.so'
pickFirst 'lib/x86_64/libaosl.so'
pickFirst 'lib/armeabi-v7a/libaosl.so'
pickFirst 'lib/arm64-v8a/libaosl.so'
}
} -
Gradle 文件同步完成后,重新构建项目。
-
通过 Cocoapods 方式集成时,在项目的
Podfile
末尾添加如下脚本:Rubypre_install do |installer|
# 定义 AgoraRtm framework 的路径
rtm_pod_path = File.join(installer.sandbox.root, 'AgoraRtm')
# aosl.xcframework 的完整路径
aosl_xcframework_path = File.join(rtm_pod_path, 'aosl.xcframework')
# 检查文件是否存在,如果存在则删除
if File.exist?(aosl_xcframework_path)
puts "Deleting aosl.xcframework from #{aosl_xcframework_path}"
FileUtils.rm_rf(aosl_xcframework_path)
else
puts "aosl.xcframework not found, skipping deletion."
end
end -
运行
pod install
重新集成 RTM 和 RTC SDK。 -
重新构建项目。