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所示。
创建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都有效。
本部分代码见这里。