Android Studio 基础篇五 productFlavors

productFlavors

使用productFlavors可以为一个项目定义不同的自定义版本,一个单一的项目可以同时定义多个不同的productFlavors,来改变项目的输出。productFlavors概念是为了解决不同版本之间差异,生成多个定制的版本,输出的应用可以使一个应用,也可以是差异性不大的应用。

[基础篇四 BuildTypes]中生成的manifests中间文件

在开始学习productFlavors前,我们来看看上一篇博文基础篇四 BuildTypes中,编译生产manifests中间文件所在目录结构。manifests中间文件在/GradleDemo/app/build/intermediates/manifests下。

1
2
3
4
5
6
7
8
9
10
11
12
13
zhaoscmatoMacBook-Pro:manifests zhaosc$ tree -L 3
.
└── full
├── anotherDebug
│   └── AndroidManifest.xml
├── customBuildType
│   └── AndroidManifest.xml
├── debug
│   └── AndroidManifest.xml
└── release
└── AndroidManifest.xml

5 directories, 4 files

我们可以看到在基础篇四 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
2
3
4
5
6
7
8
9
10
11
12
13
14
android {
...
productFlavors {
fake {
applicationId "cn.spade.android.gradle.fake"
}

real {
applicationId "cn.spade.android.gradle.real"
}
}
...

}

在GradleDemo目录下,依次执行./gradlew clean, ./gradlew assemble命令,接下来看看加入productFlavors后生成的manifests文件相关目录结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
zhaoscmatoMacBook-Pro:manifests zhaosc$ tree -L 4
.
└── full
├── fake
│   ├── anotherDebug
│   │   └── AndroidManifest.xml
│   ├── customBuildType
│   │   └── AndroidManifest.xml
│   ├── debug
│   │   └── AndroidManifest.xml
│   └── release
│   └── AndroidManifest.xml
└── real
├── anotherDebug
│   └── AndroidManifest.xml
├── customBuildType
│   └── AndroidManifest.xml
├── debug
│   └── AndroidManifest.xml
└── release
└── AndroidManifest.xml

11 directories, 8 files

与上一小节对比,目录结构发生明显变化。上一节为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等验证。

参考资料:

  1. com.android.build.gradle
  2. com.android.builder