Gradle Cheat Sheet (15): Flavors

1. Declaring Flavors

  除了使用Build Type,也可以使用Product Flavor来对build进行定制。Product Flavor一般用于创建提供给用户的不用应用版本,比如免费版和付费版。

  Anroid插件不会自动创建默认的Product Flavor。要创建Product Flavor,只需在productFlavors {} 块中进行定义,如:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.udacity.declaringflavors"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        free {
            applicationId "com.example.udacity.declaringflavors.free"
        }
        paid {
            applicationId "com.example.udacity.declaringflavors.paid"
        }
    }
}

这里创建了free 和paid 两个Flavor,并分别提供了唯一的applicationId ,这样就可以在一台设备上同时安装这两个版本的应用。

  在Build Variants面板可以选择构建时所使用的Flavor,如图1所示。

图1

图1

  创建Flavor之后,Android插件会自动为Flavor创建同名的Source Set,可以为不同的Flavor添加不同的代码和资源。例如上面创建了名为free 的Flavor,其对应的专用代码和资源分别放在src/free/java和src/free/res,Gradle会自动根据Flavor从对应的文件夹下获取代码。如在src/main/res/values/strings.xml下加入:

<string name="message">Message in main</string>

在src/free/res/values/strings.xml中加入

<string name="message">Message in free</string>

在src/paid/res/values/strings.xml下加入

<string name="message">Message in paid</string>

在应用中把这个字符串显示出来,就可以看到对于使用不同的Flavor构建的App,会显示出不同的字符串。

  除了为Flavor添加专用的代码,还可以对Flavor进行单独的配置,所有位于defaultConfig { } 块下的配置都可以放在Flavor的配置块下,如设置paid 的minSdkVersion 为23:

productFlavors {
    paid {
        minSdkVersion 23
    }
}

  本部分代码见这里

2. Flavor-Specific Dependencies

  Gradle会为Flavor生成对应的Configuration,Configuration的名称以Flavor的名称作为前缀。通过Flavor的Configuration,就可以为不同的Flavor添加不同的依赖,如:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.3.0'
    freeCompile 'com.google.android.gms:play-services:8.4.0'
}

freeCompile 是对应free Flavor的Configuration,这里为free Flavor添加依赖:

    freeCompile 'com.google.android.gms:play-services:8.4.0'

非特定Flavor的依赖对全部Flavor有效,如开头两行的:

    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.3.0'

对之前定义的free 和paid 两个Flavor都有效。

  本部分代码见这里