flavor配置不同包名
productFlavors {
dev {
applicationId "com.lyl.dev"
}
stage {
applicationId "com.lyl.stage"
}
prod {
applicationId "com.lyl.prod"
}
}
productFlavors 设置的不同环境包名会覆盖 defaultConfig 里面的设置的包名。
falvor配置不同资源文件
productFlavors {
dev {
resValue "string", "app_name", "dev_myapp"
resValue "bool", "isrRank", 'false'
}
stage {
resValue "string", "app_name", "stage_myapp"
resValue "bool", "isrRank", 'true'
}
prod {
resValue "string", "app_name", "myapp"
resValue "bool", "isrRank", 'true'
}
}
利用 resValue 来定义资源的值,顾名思义 res 底下的内容应该都可以创建,最后用 R.xxx.xxx 来引用。
注意:这里是添加,不是覆盖,不能与res文件中已有的资源文件冲突。
flavor配置BuildConfig常量
productFlavors {
dev {
buildConfigField "String", "ENVIRONMENT", '"dev"'
}
stage {
buildConfigField "String", "ENVIRONMENT", '"stage"'
}
prod {
buildConfigField "String", "ENVIRONMENT", '"prod"'
}
}
flavor配置AndroidManifest.xml 里渠道变量
1.AndroidManifest.xml设置占位符
...
...
2.build.gradle中填充占位符的值
productFlavors {
dev {
manifestPlaceholders = [ENVIRONMENT: "dev",
app_icon : "@drawable/icon_dev"]
}
stage {
manifestPlaceholders = [ENVIRONMENT: "stage",
app_icon : "@drawable/icon_stage"]
}
prod {
manifestPlaceholders = [ENVIRONMENT: "prod",
app_icon : "@drawable/icon_prod"]
}
}
flavor引用不同的module
xxxCompile 代表 各个渠道的名称(gradle3.0后改为xxxImplementation)。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// 引用本的项目
devCompile project(':devModule')
stageCompile project(':stageModule')
prodCompile project(':prodModule')
// 也可以分渠道引用网络的。因为这里都相同,所以地址也就都一样了
devCompile 'com.roughike:bottom-bar:2.0.2'
stageCompile 'com.roughike:bottom-bar:2.0.2'
prodCompile 'com.roughike:bottom-bar:2.0.2'
}
在子module中使用flavor
在子module中也有使用flavor的诸多场景,如在网络请求的module中对测试版和正式版的服务器地址会有区别,此时可以通过flavor来区别配置。现有实现如下。
注意本文配置均是基于gradle4.6,gradle3.0前后配置有些许差别。
主module中buid.gradle
android {
...
flavorDimensions ""
productFlavors{
rel {
dimension ""
}
dev {
dimension ""
}
}
...
}
dependencies {
...
relImplementation project(path: ':mylib2')
devImplementation project(path: ':mylib2')
...
}
“relImplementation”表示flavor为rel时的依赖,“devImplementation”表示flavor为dev时的依赖。
子module的build.gradle
flavorDimensions ""
productFlavors{
rel {
buildConfigField("String", "env", "\"正式服务器地址\"")
dimension ""
}
dev {
buildConfigField("String", "env", "\"测试服务器地址\"")
dimension ""
}
}
接着在代码中通过BuildConfig.env
即可获取不同flavor下的服务器地址。
再在Build variants中选择想要调试的buildType。
Tips:若主module或子module中存在独有的flavor时,处理方法参见https://www.jianshu.com/p/b8c0ec4339c1
flavor打包编译
打包
双击对应任务或terminal终端执行/gradlew xxx均能完成打包。
- assembleADSgTt即打包单个flavor下的debug和release包。
- assembleRelease即打包所有的release包。
最后打包的apk位置在xx\build\outputs\apk下。
编译
编译时在左下角BuildVariants中选择想要编译的type即可。