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等验证。
参考资料: