gradle配置 flavor和buildType小結
業務需求
為了方便測試, 期望同一手機上能同時安裝兩個App.
所以需要:
- 開發/Release版本包名不一樣
- 開發/Release icon不一樣
開發版本
圖標:
包名: com.alipictures.moviepro.dev
線上版本
圖標:
包名: com.alipictures.moviepro
利用flavor修改applicationId和AndroidManifest的icon,可以很方便的實現這個需求.
中間有一點小坑, 總結一下.
如果需要同時設置混淆和applicationId,需要flavor和buildType組合
按優先級從高到低: 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";
如果增加一個buildType. 叫做 devBuild
buildTypes {
devBuild{
}
}
那麼:
1.會增加一係列gradle task輔助編譯. 比如assembleDevBuild.
2.如果有些依賴隻在該buildType中起作用,可以設置為devBuildCompile中依賴
dependencies {
devBuildCompile project(':test')
}
因為是新增了devBuild這個build type, 所以
- 以前的debugCompile的依賴會全被失效(devBuildCompile會生效)
- 如果項目是多個Module組成. 比如 "App" module 依賴於 "Widget" Module.
"App"中加入的devBuild, 在"widget"並不能使用, 就是說"widget"不能使用devBuildCompile 處理依賴
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
最後更新:2017-10-25 10:34:20