Gradle 多环境配置

设置不同的BuildType

可以通过设置不同的 BuildType 来生成多个版本的配置。修改 app 模块下的 build.gradle:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.kasogg.demo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        debug {
            buildConfigField 'String', 'BASE_URL', '"http://debugUrl"'
        }

        sim {
            buildConfigField 'String', 'BASE_URL', '"http://simUrl"'
            minifyEnabled true  // 开启Proguard
            shrinkResources true  // 移除无用资源
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        release {
            buildConfigField 'String', 'BASE_URL', '"http://releaseUrl"'
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

设置完 BuildType 后,在 Build Variants 窗口中对应的 Module 会生成相应的 Build Variant:

img

buildConfigField

上面设置了一个类型为 String 的 BASE_URL 字段。构建后会在 build/generated/source/buildConfig 下面生成对应 BuildType 类型的 BuildConfig 文件,里面包含了所设置 buildConfigField 的值。

img

假如我们选择 debug 类型进行构建将会生成:

debug/com.kasogg.demo/BuildConfig.java:

/**
 * Automatically generated file. DO NOT MODIFY
 */
package com.kasogg.demo;

public final class BuildConfig {
  public static final boolean DEBUG = false;
  public static final String APPLICATION_ID = "com.kasogg.demo";
  public static final String BUILD_TYPE = "sim";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from build type: debug
  public static final String BASE_URL = "http://debugUrl";
}

由此我们可以根据不同环境设置不同的服务器地址,直接选择不同的 Build Variants 打包就会自动生成相应的 BASE_URL 常量,我们可以直接在项目中引用,而不用每次手动修改了。

结合配置文件管理地址

我们可以创建一个 server.properties 来存放服务器地址:

这里写图片描述

server_url.properties:

debugUrl="http://debugUrl"
simUrl="http://simUrl"
releaseUrl="http://releaseUrl"

修改 app 模块下的 build.gradle:

def Properties props = new Properties()
def propFile = file('server_url.properties')
def debugUrl, simUrl, releaseUrl
if (propFile.canRead()) {
    props.load(new FileInputStream(propFile))
    if (props != null) {
        debugUrl = props['debugUrl']
        simUrl = props['simUrl']
        releaseUrl = props['releaseUrl']
    }
}

android {
    ...
    buildTypes {
        debug {
            buildConfigField 'String', 'BASE_URL', debugUrl
        }

        sim {
            buildConfigField 'String', 'BASE_URL', simUrl
            ...        
        }

        release {
            buildConfigField 'String', 'BASE_URL', releaseUrl
            ...
        }
    }
}

上面定义了三个变量,并将 server_url.properties 中的键值对读入到这些变量中,并赋给 buildConfigField 使用。以后不同环境打包的时候只需要选择不同的 Build Variants 就可以了,而不用每次都手动修改地址了。

设置不同 sourceSets

假如每个 BuildType 应用到不同的源文件该怎么办呢?我们可以使用 sourceSets 来指定他们的源文件目录。

在 src 下创建 build-types 文件夹,并根据 build.gradle 中设置的 buildTypes 创建相应的文件夹。
假如我们不同环境中需要不同的源文件的话,只需要仿照 src/main 目录的结构创建对应的那个不同文件即可。

img

构建的时候会首先从给定的 buildType 对应的文件夹中寻找文件,如果不存在会再从 main 中寻找文件。因此不需要将所有文件从 main 中复制过来,只需要放入有差异的的文件即可。

修改 app 模块下的 build.gradle 文件,添加 sourceSets 部分:

android {
     ...
    sourceSets {
        debug.setRoot('src/build-types/debug')
        sim.setRoot('src/build-types/sim')
        release.setRoot('src/build-types/release')
    }    
    ...

    buildTypes {
        debug {
            ...
        }

        sim {
            ...
        }

        release {
           ...
        }
    }

这样以后构建时就会自动根据不同类型下的文件来构建了。

多 Module 构建的情况

新建一个 library module,名为 library。同样可以为 library 设置不同的 buildType。

有这样一个需求,如果我想根据不同的 BuildType 来依赖不同的 library module,并且 library 也具有不同的 BuildType,该怎么做呢?

打开 app 的 build.gradle 文件并修改 dependencies:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    debugCompile project(path: ':library', configuration: 'debug')
    simCompile project(path: ':library', configuration: 'debug')
    releaseCompile project(path: ':library', configuration: 'release')
    compile 'com.android.support:appcompat-v7:23.1.1'
}

其中 debugCompile 对应的就是上面 debug 的 buildType,path 就是 library module 的名字,configuration 为 library 的 buildType。这样就可以根据不同的 buildType 来依赖不同的 library 了。

当点击构建之后,会发现报一个错误:

Error:Configuration with name 'debug' not found.

这时候只要在 library 的build.gradle 加入publishNonDefault true即可,这样就可以启动其它 Variants 的发布了。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    publishNonDefault true
    ...
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值