最基本的build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 8
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
debug {signingConfig signingConfigs.myConfig}
release {signingConfig signingConfigs.myConfig
//修改apk生成文件名称
def today = new Date()
if (variant.buildType.getName().equals("release")) {
println "Change output apk name"
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName +
"-" + today.format('yyyyMMdd') + ".apk"))
}
}}
}
flavorDimensions("free", "channel") //productFlavors 必须指定对应dimension
productFlavors {
free {dimension "free"}
vip {dimension "free"}
huawei {dimension "channel"
applicationId "huawei"}
xiaomi {dimension "channel"
applicationId "xiaomi"}
}
//buildTypes 加flavorDimensions加productFlavors 最多可生成对应版本为彼此数量相乘2*2*2
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:19.0.1'
}
BuildVariants
Gradle的Android插件中有个BuildVariants的概念,其实简单来说其实就是buildTypes+productFlavors,buildType主要就是debug和release的分别。而productFlavors就是我们用来打包不同版本app的主要方式。从字面意思来翻译指的就是不同的“产品特点”。
productFlavors可以是多维的,flavorDimensions定义了2个纬度productFlavors中对应每个纬度有2个对应的productFlavor所以可以组合成2*2=4种组合。例如:vipxiaomi,viphuawei,freexiaomi,freehuawei这4个版本。
有的时候我们每个flavor可能不只是一个渠道名这么简单,我的ICON可能给每个渠道的有所不同,我的包名也可能有所不同。所有这些,都可以直接在这个flavor中重新定义,如果需要不同的源代码或资源文件,可以在app/src下新建一个名为“flavor名”的目录(比如xiaomi)。也就是app/src/xiaomi,然后这个目录下的结构和app/src/main中是一样的,打包的时候会优先使用当前flavor下的文件。
Manifest 占位符
有些SDK会把配置在Manifest文件中的meta信息里,而不同的flavor这个信息不一样,这是我们可以通过Manifest 占位符来实现
mainfest.xml片段
build.gradle片段
android {
productFlavors {
xiaomi{
applicationId "xiaomi"
manifestPlaceholders = [UMENG_APPKEY: "我的友盟KEY"]
}
}
}
Android Studio会为我们生成一个名叫BuildConfig的类,这个类有一些关于打包的静态变量,例如freexiaomidebug
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "xiaomi";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "freexiaomi";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
public static final String FLAVOR_free = "free";
public static final String FLAVOR_channel = "xiaomi";
}
refer:http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.ProductFlavor.html
http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.BaseExtension.html#com.android.build.gradle.BaseExtension:productFlavors