且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

gradle配置 flavor和buildType小结

更新时间:2022-05-27 07:49:26

业务需求

为了方便测试, 期望同一手机上能同时安装两个App.
所以需要:

  1. 开发/Release版本包名不一样
  2. 开发/Release icon不一样

开发版本

图标:gradle配置 flavor和buildType小结
包名: com.alipictures.moviepro.dev

线上版本

图标: gradle配置 flavor和buildType小结
包名: 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, 所以

  1. 以前的debugCompile的依赖会全被失效(devBuildCompile会生效)
  1. 如果项目是多个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