productFlavors
使用productFlavors可以为一个项目定义不同的自定义版本,一个单一的项目可以同时定义多个不同的productFlavors,来改变项目的输出。productFlavors概念是为了解决不同版本之间差异,生成多个定制的版本,输出的应用可以使一个应用,也可以是差异性不大的应用。
[基础篇四 BuildTypes]中生成的manifests中间文件
在开始学习productFlavors前,我们来看看上一篇博文基础篇四 BuildTypes中,编译生产manifests中间文件所在目录结构。manifests中间文件在/GradleDemo/app/build/intermediates/manifests下。
1  | zhaoscmatoMacBook-Pro:manifests zhaosc$ tree -L 3  | 
我们可以看到在基础篇四 BuildTypes中,在full目录下,根据不同的BuildType生成不同的AndroidManifest.xml文件,aapt使用这些文件打包生成不同的apk文件。可以打开不同BuildType下的AndroidManifest.xml文件确定package。
| BuildType | package | 
|---|---|
| debug | cn.spade.android.gradle.debug | 
| release | cn.spade.android.gradle.release | 
| anotherDebug | cn.spade.android.gradle.anotherDebug | 
| customBuildType | cn.spade.android.gradle.custom | 
试试productFlavors
下面我们在基础篇四 BuildTypes的基础上自定义fake与real两种productFlavors。
1  | android {  | 
在GradleDemo目录下,依次执行./gradlew clean, ./gradlew assemble命令,接下来看看加入productFlavors后生成的manifests文件相关目录结构。
1  | zhaoscmatoMacBook-Pro:manifests zhaosc$ tree -L 4  | 
与上一小节对比,目录结构发生明显变化。上一节为full/BuildType,而引入productFlavors后,目录变为full/productFlavor/BuildType。我们可以理解为:Gradle构建项目时,优先配置productFlavor,再在每个productFlavor下根据不同的BuildType去构建。
接下来,一起看看AndroidManifest.xml中的package:
| productFlavor | BuildType | package | 
|---|---|---|
| fake | debug | cn.spade.android.gradle.fake.debug | 
| fake | release | cn.spade.android.gradle.fake.release | 
| fake | anotherDebug | cn.spade.android.gradle.fake.another | 
| fake | customBuildType | cn.spade.android.gradle.fake.custom | 
| real | debug | cn.spade.android.gradle.real.debug | 
| real | release | cn.spade.android.gradle.real.release | 
| real | anotherDebug | cn.spade.android.gradle.real.another | 
| real | customBuildType | cn.spade.android.gradle.real.custom | 
- 出去的后缀分析,不同的productFlavor下使用各自配置的applicationId;
 - 单独分析fake或者real,package的后缀保持与相对应的BuildType保持一致。
 
再次验证:Gradle构建项目时,优先配置productFlavor,再在每个productFlavor下根据不同的BuildType去构建。
在这里,我们以manifests为例,原因是我们在productFlavor中只配置了applicationId。在后续的博文中,大家可以通过assets,classes,和aidl等验证。
参考资料: