Library Publication 是 Gradle 在0.9.0 时增长的一个新特性,它的做用是让Lib也能发布不一样的版本
在这以前,Lib只能发布release版本,你的项目中依赖的全部Lib也都只能是relaese版本的。这种作法看起来很合理,被依赖的库固然应该是release的,debug状态下怎么给其余项目提供依赖呀?但在实际多模块项目中,被依赖的库只是项目中普普统统的一部分,库和项目同时被开发被调试,debug状态的Lib也是很是正常的,因而很早就有人给Google提了一个issue:
https://code.google.com/p/android/issues/detail?id=52962 ,Google工程师便在gradle的0.9.0版本中增长了Library Publication特性来处理这个问题,不过好像直到1.0才彻底处理好
(转载请注明:博客园-阁刚广志,地址:http://www.cnblogs.com/bellkosmos/p/6437171.html )
对我来讲,我写的不少工具包都会打印Log,而工具包天然会放在通用的模块里,因此我固然但愿Log能根据模块当前的buildtype来决定是否打印,因而我对这个common lib 使用了Library Publication这个特性
Library Publication 不会改变以前的构建过程,只是在gradle脚本中增长了一些配置,就实现了Lib的多版本发布
Google工程师的实现思路很是简单:
- 仍是只须要选择application的variant就能够直接打包
- 改动在于,让 [application依赖的library的variant] 被 [application的variant] 控制
你具体的使用方式是也很是简洁:
- 在library中设置让library发布本身的所有variant:android.publishNonDefault = true
- 而后在application中的reference中标明不一样的 [application的variant] 依赖的不一样的 [library具体的variant] :debugCompile project(path: ':Library', configuration: 'debug')
但我在实际项目中使用时,发现直接就同步不过去,报错信息是“more than one library with package name:XXX”
正常状况下,Gradle会处理好重复依赖的问题,可是这里竟然会报这个错误,那必定是咱们在Library Publication时出了问题
原来仍是由于个人项目中依赖关系有些乱,形成了一个复杂的构建状况,致使了构建问题,这个问题的原理提及来很是简单:
- 假设有这样一个多模块项目:
-
- 应用A依赖库B和库C,同时库B和库C又都依赖库D
- 在库D上使用了新特性发布全版本,而后在库C上使用新特性控制:当C是debug的时候D也是debug、C是release的时候D也是release
- 同时在C上也发布全版本,A经过新特性控制C的版本就像C控制D同样
- 而A对B不作控制,B对D也不作控制
- 这时,可是若是你进行debug构建,就会出现问题
- 由于当应用A是debug的时候,库C是被新特性控制成debug的了,一样D也是debug,另外一边库B只默认构建release版本,就天然使用了release,而库B依赖的库D由于是普通依赖,天然也是默认的release
- 这样整个项目中就会存在一个debug的库D和一个release的库D,Gradle就报了构建错误:more than one library with package name:XXX
- (若是你对应用A进行release构建,不会有问题,能够本身推理一下缘由)
知道缘由以后解决这个问题就能够直接对症下药了:让库B也发布全版本,让项目A控制库B的版本,让库B控制库D的版本