gradle配置 flavor和buildType小结

简介: gradle配置 flavor和buildType小结

业务需求

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

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

开发版本

图标:da0bba0aae2ffa2b55e4261690f944d8.png
包名: com.alipictures.moviepro.dev

线上版本

图标: 301d3edfa21bfd9d7d317d7c054dedde.png
包名: 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
目录
相关文章
|
5月前
|
Java Linux iOS开发
Linux下安装并配置Gradle
Linux下安装并配置Gradle
168 0
|
5月前
|
缓存 Java 开发工具
【开发工具】Gradle的安装 与 配置环境变量
【开发工具】Gradle的安装 与 配置环境变量
108 0
|
7月前
|
Java Linux Shell
Gradle下载和配置教程:Windows、Mac和Linux系统安装指南
Gradle下载和配置教程:Windows、Mac和Linux系统安装指南
504 0
|
12月前
|
XML IDE Java
Android gradle.properties 基础使用和常规配置
Gradle 是一个开源构建自动化工具,其设计足够灵活,可以构建几乎任何类型的软件。
|
XML Java Apache
Gradle安装与配置
Gradle安装与配置
Gradle安装与配置
|
6天前
|
XML Java Android开发
gradle配置
gradle配置
18 0
|
11天前
|
Java Maven Spring
gradle 配置指南
在`build.gradle`中配置Gradle仓库,首先添加阿里云公共仓库
|
Java Android开发
【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )(一)
【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )(一)
437 0
【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )(一)
|
5月前
|
开发工具 Android开发 开发者
Android 项目编译 Gradle 配置说明
Android 项目编译 Gradle 配置说明
160 0
|
5月前
|
IDE Java Maven
Maven或Gradle:构建工具的使用和配置等知识讲解梳理
Maven或Gradle:构建工具的使用和配置等知识讲解梳理
95 1