閱讀638 返回首頁    go 阿裏雲 go 技術社區[雲棲]


gradle配置 flavor和buildType小結

業務需求

為了方便測試, 期望同一手機上能同時安裝兩個App.
所以需要:

  1. 開發/Release版本包名不一樣
  2. 開發/Release icon不一樣

開發版本

圖標:da0bba0aae2ffa2b55e4261690f944d8.png
包名: com.alipictures.moviepro.dev

線上版本

圖標: 301d3edfa21bfd9d7d317d7c054dedde.png
包名: 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, 所以

  1. 以前的debugCompile的依賴會全被失效(devBuildCompile會生效)
  2. 如果項目是多個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

  上一篇:go  學習ASP.NET Core, 怎能不了解請求處理管道[4]: 應用的入口——Startup
  下一篇:go  【ICCV 2017華人雄起】何愷明包攬兩項最佳論文,40%投稿來自中國