【发布时间】:2014-08-10 11:40:21
【问题描述】:
在构建具有两个库模块的父项目时遇到“重复文件”冲突,这两个库模块使用相同的 libc++_shared.so 共享库。
(注意:请不要认为这是一个“重复的问题”。我已经阅读了几篇相关的帖子,这些帖子帮助我走到了这一步。但是,没有帖子提供适用于我的案例涉及 NDK 工件。)
当我只有 1 个这样的库模块时,构建工作正常。添加第二个库模块现在正在产生冲突。
考虑以下项目结构:1 个父项目,2 个“子”项目 - 但每个项目都位于同一目录级别(即不分层嵌套)
ProjectA/ (Parent)
LibraryModuleA1/
build/exploded-aar/com.package.name/
LibraryModuleB1/<version>/jni/armeabi-v7a/libc++_shared.so
LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
build.gradle (bgA1)
Test_APK_Module A1T/
build.gradle (bgA1T)
build.gradle (bgPA)
ProjectB/
LibraryModuleB1/ (Uses NDK)
build/lib/armeabi-v7a/libc++_shared.so
build.gradle (bgB1)
build.gradle (bgPB)
ProjectC/
LibraryModuleC1/ (Uses NDK)
build/lib/armeabi-v7a/libc++_shared.so
build.gradle (bgC1)
build.gradle (bgPC)
库模块 A1 依赖于库模块 B1 和 C1。
A1 -> B1
A1 -> C1
项目 B 和 C 都具有基于 NDK 的代码并且可以正确构建/测试。两者都依赖于libc++_shared.so 共享库。
但是,在构建项目 A 时,我在 :LibraryModuleA1:packageDebugTest 任务期间收到以下错误:
Error: duplicate files during packaging of APK /ProjectA/LibraryModuleA1/build/apk/LibraryModuleA1-debug-test-unaligned.apk
Path in archive: lib/armeabi-v7a/libc++_shared.so
Origin 1: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleB1/<version>/jni/armeabi-v7a/libc++_shared.so
Origin 2: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
You can ignore those files in your build.gradle:
android {
packagingOptions {
exclude 'lib/armeabi-v7a/libc++_shared.so'
}
}
* What went wrong:
Execution failed for task ':LibraryModuleA1:packageDebugTest'.
> Duplicate files copied in APK lib/armeabi-v7a/libc++_shared.so
File 1: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
File 2: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
:LibraryModuleA1:packageDebugTest FAILED
到目前为止我的尝试
- 我试图将建议的闭包添加到我的
build.gradle文件中,但是我应该将它添加到哪个build.gradle文件中?我已将闭包添加到bgA1、bgB1和bgC1(一次一个),但没有成功。 - 建议的关闭表示使用
exclude 'lib/armeabi-v7a/libc++_shared.so'。每个“子”库模块在build/lib路径下构建libc++_shared.so文件。但是,我注意到父库模块复制了build/exploded-aar目录结构内jni/armeabi-v7a/libc++_shared.so下的libc++_shared.so文件。 (见上文)闭包应该改为exclude 'jni/armeabi-v7a/libc++_shared.so(即jnivs.lib)吗? - 由于我使用的是 Gradle 插件 0.9.1,因此我尝试使用
pickFirst代替exclude,但这也没有成功。
有人可以帮助确定我应该如何为我的给定案例配置 `packagingOptions' 闭包吗?
感谢您的帮助!
【问题讨论】:
标签: android c++ android-ndk android-gradle-plugin