flavor配置不同包名
productFlavors {
dev {
applicationId "com.lyl.dev"
}
stage {
applicationId "com.lyl.stage"
}
prod {
applicationId "com.lyl.prod"
}
}
productFlavors 設(shè)置的不同環(huán)境包名會覆蓋 defaultConfig 里面的設(shè)置的包名击吱。
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 底下的內(nèi)容應(yīng)該都可以創(chuàng)建诉濒,最后用 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設(shè)置占位符
<application
android:icon="${app_icon}"
android:label="@string/app_name"
android:theme="@style/AppTheme">
...
<meta-data
android:name="UMENG_CHANNEL"
android:value="${ENVIRONMENT}" />
...
</application>
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 代表 各個(gè)渠道的名稱(gradle3.0后改為xxxImplementation)乡洼。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// 引用本的項(xiàng)目
devCompile project(':devModule')
stageCompile project(':stageModule')
prodCompile project(':prodModule')
// 也可以分渠道引用網(wǎng)絡(luò)的崇裁。因?yàn)檫@里都相同,所以地址也就都一樣了
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的諸多場景束昵,如在網(wǎng)絡(luò)請求的module中對測試版和正式版的服務(wù)器地址會有區(qū)別拔稳,此時(shí)可以通過flavor來區(qū)別配置。現(xiàn)有實(shí)現(xiàn)如下锹雏。
注意本文配置均是基于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時(shí)的依賴,“devImplementation”表示flavor為dev時(shí)的依賴轻绞。
子module的build.gradle
flavorDimensions ""
productFlavors{
rel {
buildConfigField("String", "env", "\"正式服務(wù)器地址\"")
dimension ""
}
dev {
buildConfigField("String", "env", "\"測試服務(wù)器地址\"")
dimension ""
}
}
接著在代碼中通過BuildConfig.env
即可獲取不同flavor下的服務(wù)器地址采记。
再在Build variants中選擇想要調(diào)試的buildType。
Tips:若主module或子module中存在獨(dú)有的flavor時(shí)政勃,處理方法參見http://www.reibang.com/p/b8c0ec4339c1
flavor打包編譯
打包
雙擊對應(yīng)任務(wù)或terminal終端執(zhí)行/gradlew xxx均能完成打包唧龄。
- assembleADSgTt即打包單個(gè)flavor下的debug和release包。
- assembleRelease即打包所有的release包奸远。
最后打包的apk位置在xx\build\outputs\apk下既棺。
編譯
編譯時(shí)在左下角BuildVariants中選擇想要編譯的type即可。