如何处理同时集成 RTM SDK 和 RTC SDK 遇到的问题?
问题描述
同时集成 2.2.0 或以上版本的 RTM SDK 和 4.3.0 或以上版本的 RTC SDK 时,如果未开启 subspec
(iOS) 或指定轻量级 maven 仓库 (Android),IDE 中会出现如下报错信息:
-
Android:
Shellcom.android.builder.merge.DuplicateRelativeFileException: More than one file was found with OS independent path 'lib/x86/libaosl.so'
-
iOS:
ShellUnexpected duplicate tasks
Multiple commands produce <your_app_build_path>/Contents/Frameworks/aosl.framework/Versions/A'ShellThe 'XXX' target has frameworks with conflicting names: aosl.xcframework.
问题原因
2.2.0 及以上版本的 RTM SDK 和 4.3.0 及以上版本的 RTC SDK 都用到了一个相同的库:
- Android:
lib/x86/libaosl.so
- iOS:
libs/aosl.xcframework
所以 IDE 在构建过程中会提示存在多个具有相同路径的文件。
解决方案
升级版本
RTM SDK 从 2.2.2 开始支持 subspec
和轻量级 maven 仓库。如果你使用的是 2.2.2 之前的版本,我们推荐你将 SDK 升级至 2.2.2 或以上版本,并通过如下方式集成,你就可以避免上述问题:
Java SDK
// ...
dependencies {
// 如果你使用的是 2.2.2 或之后版本的 RTM SDK,且项目中同时使用了 RTC SDK v4.3.0 或以上版本
// 将 x.y.z 替换为具体的 SDK 版本号,如 2.2.2
// 可通过发版说明获取最新版本号
implementation 'io.agora:agora-rtm-lite:x.y.z'
}
Objective-C SDK
platform :ios, '11.0'
target 'Your App' do
# 如果你使用的是 2.2.2 或之后版本的 RTM SDK,且项目中同时使用了 RTC SDK v4.3.0 或以上版本
# 将 x.y.z 替换为具体的 SDK 版本号,如 2.2.0
# 可通过发版说明获取最新版本号
pod 'AgoraRtm', 'x.y.z', :subspecs => ['RtmKit']
end
手动删除重复文件
如果你使用的是 2.2.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。 -
重新构建项目。