实际开发中遇到过这样的问题:
1、android library module的Build Variants怎么切换,都是编译的release版本。
2、android library module中无法添加productFlavors,现象是添加后主module就会提示找不到类
在没有找到解决方法时,问题1就只能手动改build.gradle文件,再来编译。问题2就直接使用buildTypes来代替了,模糊了界线。。
其实这两个问题都是用同一个方法解决的。
先带大家看一段源码,进入defaultConfig中,是的,就是build.gradle,android下的defaultConfig,可以看到两个参数
defaultPublishConfig,意思是library module只能以release方式编译,无论我们怎么切换,而publicshNonDefault是一个开关,true表示关闭defaultPublishConfig默认值,反之,打开。所以要想解决问题1,我们至少要先将这个开关设置成true。
首先,在library module 的build.gradle上添加的android中添加
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
publishNonDefault true
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
}
}
但即使这样,我们去切换
Build Variants,会有提示,然后还是没有用。
接下去我们要做的,将library module的productFlavors的编译选择“搬到”主module中去,直白来说就是在主module中创建一一对应的productFlavors。看操作
在library module中创建,我们所需的productFlavors
productFlavors {
xiaomi {
}
huawei {
}
}
接着,你就可以在主module中指定编译的版本了
导入library module时,原本是
compile project(':lib_module')
改成
debugCompile project(path :':lib_module', configuration: 'xiaomiRelease')
releaseCompile project(path: ':lib_module', configuration: 'huaweiRelease')
我们将xiaomiRelease包指定为debug版本了,可以发现第一个debugCompile 是指主module的buildType(也可以productFlavors),后面的configuration是library module的productFlavors+buildType
这样切换主module的Build Variants,library moudle也会跟着改变,运行后也是预想中的版本了。
但是上面的例子有点奇怪,debug对应是xiaomi,我们可以再进行修改
例如直接在主moudle中添加一样的,buildTypes或productFlavors都可以
buildTypes(productFlavors) {
xiaomi {
}
huawei {
}
}
然后导入library就可以改成
xiaomiCompile project(path :':lib_module', configuration: 'xiaomiRelease')
huaweiCompile project(path: ':lib_module', configuration: 'huaweiRelease')
这样编译下,buildTypes都是非debug版本,即需要签名后才方便安装。
可能大家会有些乱,实际操作后就会好理解多了
最后还有一个问题,我们都知道N个buildTypes和M个productFlavors可以产生N*M个编译结果,所以,其实基本上例子,在方module中我们得创建2*2个buildTypes来对应lib
buildTypes {
xiaomiDebug.initWith(buildTypes.debug)//声明此类型也是debug
xiaomiDebug{
}
xiaomiRelease{
}
huaweiDebug.initWith(buildTypes.debug)
huaweiDebug {
}
huaweiRelease{
}
}
//导入lib
xiaomiDebugCompile project(path :':lib_module', configuration: 'xiaomiDebug')
xiaomiReleaseCompile project(path :':lib_module', configuration: 'xiaomiRelease')
huaweiDebugCompile project(path: ':lib_module', configuration: 'huaweiDebug')
huaweiReleaseCompile project(path: ':lib_module', configuration: 'huaweiRelease')
这样就可以一一对应上了