Gradle 多环境配置

来源:互联网 发布:toblerone淘宝 编辑:程序博客网 时间:2024/06/05 22:42

设置不同的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:



buildConfigField


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



假如我们选择 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 目录的结构创建对应的那个不同文件即可。



构建的时候会首先从给定的 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   ...
内容来自微信公众号 猿人部落(yuanrenclub) KasoGG  
侵删.
0 0
原创粉丝点击