Android 在Gradle中排除子项目
我有两个库项目,A和B,都依赖于第三个库项目C 我尝试在我的应用程序项目中同时使用A和B,方法是在我的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
应用程序/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
是我在启动调试构建时自行设置的一个环境变量,因此不要指望通过简单地复制粘贴到项目中就能实现这一点