如何在多项目Android构建中排除重复的C共享库(.so)?
我在使用两个库模块构建父项目时遇到了“重复文件”冲突,这两个库模块使用相同的如何在多项目Android构建中排除重复的C共享库(.so)?,android,c++,android-ndk,android-gradle-plugin,Android,C++,Android Ndk,Android Gradle Plugin,我在使用两个库模块构建父项目时遇到了“重复文件”冲突,这两个库模块使用相同的libc++\u共享库 (注:请不要认为这是一个“重复的问题”。我已经阅读了几个相关的帖子,这帮助我走了这么远。然而,没有帖子提供了一个适用于我的情况下,涉及NDK文物。 当我只有一个这样的库模块时,构建工作正常。第二个库模块的添加现在正在产生冲突 考虑以下项目结构:1个父项目,2个“子”项目-但每个项目位于同一目录级别(即不分层嵌套) 到目前为止我已经尝试过的 我试图将建议的闭包添加到我的build.gradle文件中
libc++\u共享库
(<强>注:请不要认为这是一个“重复的问题”。我已经阅读了几个相关的帖子,这帮助我走了这么远。然而,没有帖子提供了一个适用于我的情况下,涉及NDK文物。
当我只有一个这样的库模块时,构建工作正常。第二个库模块的添加现在正在产生冲突
考虑以下项目结构:1个父项目,2个“子”项目-但每个项目位于同一目录级别(即不分层嵌套)
到目前为止我已经尝试过的
我试图将建议的闭包添加到我的build.gradle
文件中,但我应该将其添加到哪个build.gradle
文件中?我已将闭包添加到bgA1
、bgB1
和bgC1
(一次一个),但没有成功李>
建议的闭包是使用排除'lib/armeabi-v7a/libc++\u shared.so'
。每个“子”库模块在build/lib
路径下构建libc++\u shared.so
文件。但是,我注意到父库模块将libc++\u shared.so
文件复制到jni/armeabi-v7a/libc++\u shared.so下的build/exploded aar
目录结构中。(见上文)闭包是否应改为排除“jni/armeabi-v7a/libc++\u共享。so
(即jni
与lib
)李>
由于我使用的是Gradle plugin 0.9.1,我尝试使用pickFirst
代替exclude
,但也没有成功
有人能帮我决定如何为我的给定案例配置“PackageOptions”闭包吗
谢谢你的帮助 我也遇到了同样的问题,在exclude或pickFirst上没有运气。所以我用了一个有点难看的变通方法。其思想是在主项目的build目录中创建一个“native libs”文件夹,从ndk库项目中复制所有必需的*.so文件,然后告诉构建系统将这些libs打包到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'
然后,“dependendk.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
}
//为依赖于具有NDK部件的本机库的项目生成帮助程序
//在项目主文件中定义所依赖的ndk库列表:
//ext.jniProjects=[project(':ndklib1')]
//申请者:'depend\ndk.gradle'
构建脚本{
存储库{
jcenter()
mavenCentral()
}
依赖关系{
classpath'com.android.tools.build:gradle:0.12.+'
}
}
导入com.android.build.gradle.tasks.PackageApplication
//作为一种解决方法,我们在当前项目中创建一个新的“本机libs”文件夹,然后
//复制所有的文件。所以我们依赖它
def ndkLibsDir=新文件(buildDir,'native libs')
ndkLibsDir.mkdir()
任务copyDependingNativeLibs(类型:Copy){
//复印文件http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Copy.html
println'jniProjects'+jniProjects
jniProjects.each{
from(新文件(it.buildDir,'native libs')){
包括“***.so”
}
}
进入ndkLibsDir
}
tasks.withType(PackageApplication){pkgTask->
pkgTask.jniFolders=new HashSet()
pkgTask.jniFolders.add(ndkLibsDir)
pkgTask.dependsOn copyDependingNativeLibs
}
如何触发PackageApplication?在应用程序中-我没有在调试版本中看到它。。。所以我的调试APK包括。。。谢谢。你说得对,我在让CopyDependengNativeLibs自动运行时遇到了麻烦。我认为将其添加为pkgTask的依赖项不是正确的做法。我还没有时间找到解决方案,所以现在我只是在更改某些本机部分时运行“/gradlew app:copyDependingNativeLibs”。
// Ndk stuff. We have to explicitely manage our NDK dependencies
ext.jniProjects = [project(':ndklib1'), project(':ndklib2'), project(':ndklib3')]
apply from: '../depend_ndk.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
}