在开发过程中,有时会遇到同一个APP要依赖不同的类库打不同的apk或者是同一个App打包的时候依赖不同的module。这个要怎么实现呢。其实很简单,就是使用我们的ProductFlavors。这里就不多说,直接看代码
productFlavors {
apkBaidu {}
apk360{}
}
我们先声明两个Flavor,假设我们这里有moduleA,moduleB,baiduApk只依赖moduleA,360Apk依赖moduleA、moduleB,这里我们gradle要怎么配置呢,看代码:
apkBaiduCompile project(path: ':moduleA', configuration: 'release')
apk360Compile project(path: ':moduleA', configuration: 'release')
apk360Compile project(path: ':moduleB', configuration: 'release')
像以前正常依赖一个module是这样依赖的,
compile project(':moduleA')
这里我们通过FlavorNane+Compile 代替常规的compile指令,来区分这个依赖是哪一种Flavor编译需要的依赖。
这里补充下跟本文无关的知识点,我们怎么选择具体是哪一种Flavor编译呢,可以在as的左边底部面板Build Variants中选择具体的编译方式,比如我们上面有两个Flavor,那体现在Build Variants中就会出现四个变体,
apkBaiduDebug、apkBaiduRelease、apk360Debug,apk360Release。
我们选择具体的一个,直接按run编译我们的App,就会生成对应的包。下面介绍下高级用法,我们也可以在右边Gradle面板中找到我们的项目,在项目下tasks–>build—>找到assembleApkBaidu,或者assembleApk360进行编译,会同时生成Debug跟Release包,具体使用方法这里就不多说了。
细心的读者可能会发现,我们上面依赖module是这样配置的
apk360Compile project(path: ':moduleA', configuration: 'debug')
后面多出来这个configuration是什么呢?
这里其实是我们通过配置决定了moduleA这个库的编译方式为debug,as在正常情况下,我们app依赖的module编译方式是Release,这样导致我们在debug下,无法对这个module进行调试。所以我们在这里依赖的时候指定了module的编译方式为debug,这里如果单是这样配置,其实是无法实现module的debug编译的,需要在module中的gradle下的android节点下增加一下配置
android {
publishNonDefault true
}
将module的配置公开给外部设置。
讲到这里,本文内容也差不多结束了?不不不!这里还有个知识点还没讲到,
有的同学可能以前已经使用过下面的配置方式
debugCompile project(path: ':moduleA', configuration: 'debug')
releaseCompile project(path: ':moduleA', configuration: 'release')
使用上面的配置方式顶替
compile project(':moduleA')
来选择debug跟release模式下的module编译模式。
通过上文提到的FlavorName+Compile这样组合的指令,同学们可能会有这样的需求
FlavorName+Debug+Compile or FlavorName+Release+Compile
可实际上呢,当我们这样配置指令后
apkBaiduReleaseCompile project(path: ':moduleA', configuration: 'release')
apkBaiduDebugCompile project(path: ':moduleA', configuration: 'debug')
点击Sync Now的时候,会发现,As提示apkBaiduReleaseCompile 跟命令不存在。这下就尴尬了吧。可是我们就是有这样的需要啊。这怎么办。
接着看代码:
configurations {
apkBaiduDebugCompile
apkBaiduReleaseCompile
apk360DebugCompile
apk360ReleaseCompile
}
我们在gradle的android节点下先声明这些指令,然后dependencies中就可以使用了。现在我们点击Sync Now试试看,是不是编译通过了。