设置不同的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
侵删.