在构建具有两个库模块的父项目时,我遇到了“重复文件”冲突,这两个库模块使用了相同的libc++_shared.so
共享库。
(注意:请不要认为这是一个“重复的问题”。我已经阅读了几篇相关的帖子,这些帖子帮助我做到了这一点。但是,没有帖子提供了一个有效的答案我的案例涉及 NDK工件。)
当我只有一个这样的库模块时,构建工作正常。第二个库模块的添加现在正在产生冲突。
考虑以下项目结构: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 - &gt; B1
A1 - &gt; 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'
。每个“子”库模块都在libc++_shared.so
路径下构建build/lib
文件。但是,我注意到父库模块将libc++_shared.so
文件复制到jni/armeabi-v7a/libc++_shared.so
目录结构中的build/exploded-aar
下。 (见上文)封闭是否应该是exclude 'jni/armeabi-v7a/libc++_shared.so
(即jni
与lib
)? pickFirst
代替exclude
,但这也不成功。有人可以帮助确定我应该如何为我的特定情况配置`packagingOptions'闭包吗?
感谢您的帮助!
答案 0 :(得分:1)
我遇到了同样的问题,并且没有排除或pickFirst的运气。所以我使用了一些有点丑陋的解决方法。我们的想法是在主项目的构建目录中创建一个'native-libs'文件夹,从那里的ndk库项目中复制所有必需的* .so文件,然后告诉构建系统将这些库包装在apk中。
在我的主项目(app项目)中,我明确地定义了包含我所依赖的ndk代码的模块列表
// Ndk stuff. We have to explicitely manage our NDK dependencies
ext.jniProjects = [project(':ndklib1'), project(':ndklib2'), project(':ndklib3')]
apply from: '../depend_ndk.gradle'
然后,'depend_ndk.gradle'是一个包含
的gradle外部脚本// Build helper for projects that depends on a native library with a NDK part
// Define the list of ndk library you depend on in project main file :
// ext.jniProjects = [project(':ndklib1')]
// apply from : 'depend_ndk.gradle'
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
import com.android.build.gradle.tasks.PackageApplication
// As a workaround, we create a new 'native-libs' folder in the current project and
// copy all the .so we depend on into it
def ndkLibsDir = new File(buildDir, 'native-libs')
ndkLibsDir.mkdir()
task copyDependingNativeLibs(type: Copy) {
// Doc for copy http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Copy.html
println 'jniProjects ' + jniProjects
jniProjects.each {
from(new File(it.buildDir, 'native-libs')) {
include '**/*.so'
}
}
into ndkLibsDir
}
tasks.withType(PackageApplication) { pkgTask ->
pkgTask.jniFolders = new HashSet<File>()
pkgTask.jniFolders.add(ndkLibsDir)
pkgTask.dependsOn copyDependingNativeLibs
}