前提
如果我们想用Gradle打出多渠道的包,需要在build.gradle脚本中加入代码:
productFlavors {
pro {
packageName "com.androidtool.pro"
}
dev {
}
}
情景一
如果各个渠道包需要依赖的库都是一样的,非常好说,在dependencies中加入相应依赖库即可,如果需求是需要对每个渠道包配置不同的dependencies,就需要对不同的渠道包进行分别配置,对于前提中的例子来说,可以在build.gradle中添加如下代码:
android {
/*其它相关代码*/
productFlavors {
pro {
packageName "com.androidtool.pro"
}
dev {
}
}
}
dependencies {
compile 'com.android.support:support-v4:22.2.0'
proCompile project(':lib')
devCompile project(':libnew')
}
以上,pro渠道包依赖lib, dev渠道包依赖libnew,注意大小写,如是渠道依赖,为flavorCompile,如果是普通依赖,为compile.
情景二
需求
如果需求是lib有几个渠道,对于app来讲,需要依赖某个渠道的lib,此时,如果只是在app的build.gradle中简单地写上 compile project(':lib'),这个时候依赖配置是不生效的。这是因为gradle本身有bug(据说这个问题已经在试图修复列表中),对于lib来说,只能编译默认的版本,即Release的配置版本,并且如果设置了渠道号,就不会编译出Release和Debug版本了。在app中直接使用compile,则是表明了我需要依赖lib的默认Release版本,但是Release版本已经不会被编译了,这个设置显然就会发生错误……(虽然不会报错,但是依赖是不生效的)~~
解决方案
值得庆幸的是,gradle设置了一个参数可以解决这个问题。如果设置了渠道号,则要在lib的build.gradle中声明publishNonDefault true,表示编译此lib的其它所有的编译版本:
android {
publishNonDefault true
productFlavors {
pro { }
dev { }
}
}
之后在app中的依赖中声明需要依赖的相应版本,如下代码所示(通过验证,如果app中没有声明相应的渠道号,刚编译会出现找不到devCompile的错误,所以lib和app中的渠道号应该保持相一致的):
android {
/*其它相关代码*/
productFlavors {
pro { }
dev { }
}
}
dependencies {
/*其它相关代码*/
proCompile project(path:':lib', configuration:'proRelease') // or 'proDebug'
devCompile project(path:':lib', configuration:'devDebug') // or 'devRelease'
}
情景三
此需求是情景二需求的延伸,即如果你的lib只有一个渠道,或你的app只需要依赖一个渠道,还有一个方法,不用声明publishNonDefault true,而是声明lib的默认配置为你所需要依赖的配置,defaultPublishConfig"devRelease",这样在app中就不用按上面的格式写依赖了,直接写compile project(':lib')即可,如下: 在你的lib的build.gradle中,声明lib的默认编译版本:
android {
defaultPublishConfig "devRelease"
}
在你的app的build.gradle中,需要加上如下的依赖脚本:
dependencies {
/*其它相关代码*/
compile project(':lib')
}