Android 在Gradle中排除子项目

Android 在Gradle中排除子项目,android,gradle,Android,Gradle,我有两个库项目,A和B,都依赖于第三个库项目C 我尝试在我的应用程序项目中同时使用A和B,方法是在我的应用程序/build.gradle中使用以下内容: implementation project(':libraryA') implementation project(':libraryB') if(System.getenv('DEBUG_BUILD') != "1") { compile project(':libraryC') } else { co

我有两个库项目,A和B,都依赖于第三个库项目C

我尝试在我的应用程序项目中同时使用A和B,方法是在我的
应用程序/build.gradle中使用以下内容:

implementation project(':libraryA')
implementation project(':libraryB')
if(System.getenv('DEBUG_BUILD') != "1") {
    compile project(':libraryC')
} else {
    compileOnly project(':libraryC')
}
这在创建发布版本时工作正常,但在调试版本时失败,出现以下错误:

> Task :app:transformDexArchiveWithDexMergerForDebug FAILED
D8: Program type already present: com.libraryc.SomeClass
看起来两次发布库项目C是可以的,因为名称会被单独混淆,并且没有冲突(因为我为发布版本启用了
minifyEnabled true
)。但是,这不会在调试中运行

由于
libraryA
libraryB
都需要对
libraryC
的依赖关系,我想解决方案是保留这些依赖关系,但将其中一个从应用程序的
app/build.gradle
中排除。我不清楚怎么做

我读过关于如何排除模块和组的内容,但做了如下操作:

implementation project(':libraryA') {
    exclude module: 'libraryC'
}


不起作用,因为Gradle似乎不认识这些命令(我猜这是因为“libraryC”是一个项目,而不是一个模块?)

最终起作用的是,在
libraryA
build.Gradle
中,使用
compileOnly
进行
libraryC
调试模式和
compile
发布模式

我对这项工作的理解如下:

  • 在发布模式下,
    libraryC
    的两个版本都将从应用程序中取出。因为它们都是预先准备好的(模糊的),所以和以前一样没有冲突
  • 在调试模式下,只有
    libraryB
    版本的
    libraryC
    从应用程序中取出。由于这里没有任何进展,
    libraryA
    可以使用从
    libraryB
    导出的版本,没有问题
在我的例子中,我可以通过检查作为整个构建过程一部分手动设置的环境变量来确定构建类型,因此这就是
libraryA
build.gradle

implementation project(':libraryA')
implementation project(':libraryB')
if(System.getenv('DEBUG_BUILD') != "1") {
    compile project(':libraryC')
} else {
    compileOnly project(':libraryC')
}
请注意,
DEBUG\u BUILD
是我在启动调试构建时自行设置的一个环境变量,因此不要指望通过简单地复制粘贴到项目中就能实现这一点