更新时间:2022-05-27 07:49:26
为了方便测试, 期望同一手机上能同时安装两个App.
所以需要:
- 开发/Release版本包名不一样
- 开发/Release icon不一样
图标:
包名: com.alipictures.moviepro.dev
图标:
包名: com.alipictures.moviepro
利用flavor修改applicationId和AndroidManifest的icon,可以很方便的实现这个需求.
中间有一点小坑, 总结一下.
如果需要同时设置混淆和applicationId,需要flavor和buildType组合
例如同时存在同一变量定义.
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的会生效.
\"
号举例:
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";
如果增加一个buildType. 叫做 devBuild
buildTypes {
devBuild{
}
}
1.会增加一系列gradle task辅助编译. 比如assembleDevBuild.
2.如果有些依赖只在该buildType中起作用,可以设置为devBuildCompile中依赖
dependencies {
devBuildCompile project(':test')
}
3.带来的坑:
因为是新增了devBuild这个build type, 所以
- 以前的debugCompile的依赖会全被失效(devBuildCompile会生效)
flavor会和buildType做一个组合,生成编译task
如果增加了flavor名为 dev, 会新增assembleDevRelease 和assembleDevDebug 命令
//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"]
}
}
}
//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);
}
}
}
}
测试包:
assembleDevDebug
发布包:
assembleOfficialRelease