业务需求
为了方便测试, 期望同一手机上能同时安装两个App.
所以需要:
- 开发/Release版本包名不一样
- 开发/Release icon不一样
开发版本
图标:
包名: com.alipictures.moviepro.dev
线上版本
图标:
包名: com.alipictures.moviepro
利用flavor修改applicationId和AndroidManifest的icon,可以很方便的实现这个需求.
中间有一点小坑, 总结一下.
几个flavor和buildType的结论
1. buildTypes不能设置 applicationId
2. productFlavors不能设置 minifyEnabled
如果需要同时设置混淆和applicationId,需要flavor和buildType组合
3. buildConfigField的覆盖关系是
按优先级从高到低: buildType->Flavor->defaultConfig
例如同时存在同一变量定义.
productFlavors {
dev {
buildConfigField "String", "ADD_BY_FLAVOR_DEV", "\"set_in_flavor\""
}
}
defaultConfig {
buildConfigField "String", "ADD_BY_FLAVOR_DEV", "\"set_in_default_config\""
}
buildTypes {
debug {
buildConfigField "String", "ADD_BY_FLAVOR_DEV", "\"set_in_build_type\""
}
}
最终 buildTypes的会生效.
4. 添加buildConfigField的时候, 如果是String加上\"
号
举例:
buildConfigField "String", "ADD_BY_FLAVOR_DEV",
"ADD_BY_FLAVOR_DEV"
生成的BuildConfig.java会变成
public static final String ADD_BY_FLAVOR_DEV = ADD_BY_FLAVOR_DEV;
这并不是一个字符串.
所以需要改为
buildConfigField "String", "ADD_BY_FLAVOR_DEV",
"\"ADD_BY_FLAVOR_DEV\""
生成的BuildConfig.java会变成
public static final String ADD_BY_FLAVOR_DEV = "ADD_BY_FLAVOR_DEV";
5.增加BuildType带来的影响
如果增加一个buildType. 叫做 devBuild
buildTypes {
devBuild{
}
}
那么:
1.会增加一系列gradle task辅助编译. 比如assembleDevBuild.
2.如果有些依赖只在该buildType中起作用,可以设置为devBuildCompile中依赖
dependencies {
devBuildCompile project(':test')
}
3.带来的坑:
因为是新增了devBuild这个build type, 所以
- 以前的debugCompile的依赖会全被失效(devBuildCompile会生效)
- 如果项目是多个Module组成. 比如 "App" module 依赖于 "Widget" Module.
"App"中加入的devBuild, 在"widget"并不能使用, 就是说"widget"不能使用devBuildCompile 处理依赖
6.增加Flavor带来的影响
flavor会和buildType做一个组合,生成编译task
如果增加了flavor名为 dev, 会新增assembleDevRelease 和assembleDevDebug 命令
淘票票专业版本修改结果
1.设置两个flavor,控制package name和icon
//build.gradle
android {
productFlavors {
dev {
applicationId "com.alipictures.moviepro.dev"
manifestPlaceholders = [label: "开发版", icon: "@drawable/icon_debug"]
}
official {
applicationId "com.alipictures.moviepro"
manifestPlaceholders = [label: "@string/app_name", icon: "@drawable/ic_launcher"]
}
}
}
2.排除 devRelease; officialDebug这两种编译
//build.gradle
android.variantFilter { variant ->
if (variant.buildType.name.equals('release')) {
variant.getFlavors().each() { flavor ->
if (flavor.name.equals('dev')) {
variant.setIgnore(true);
}
}
}
if (variant.buildType.name.equals('debug')) {
variant.getFlavors().each() { flavor ->
if (flavor.name.equals('official')) {
variant.setIgnore(true);
}
}
}
}
3.摩天轮编译命令
测试包:
assembleDevDebug
发布包:
assembleOfficialRelease