在实际工作中,我们可能会给很动客户提供apk,而不同的客户又有不同的需求,如果需求不是差别很大的话,通过Gradle来管理是非常方便的。Gradle的Android plugin提供了productFlavors方法来实现对多个项目的管理,具体实现方法为在项目Gradle脚本的android配置下加入以下代码,就加入了两个项目的版本管理,其强大的地方在于可以通过对不同flavor的sourceSets进行配置来实现差异化,比如在src/escape/values的值会在编译时覆盖main sourceSets里的res/values的值,达到overlay的效果,后面会详细的对这项属性进行介绍:
android{
. . . . . .
productFlavors{
escape{
versionName "1.0-escape"
}
tcl{
versionName "1.0-tcl"
}
}
. . . . . .
}
然后点击Build Variant右边的箭头就可以选择相应的版本进行编译
详细介绍Build variants(构建变种版本)
该项功能主要是用来从一个单独工程创建一个应用的不同版本,这是非常有用的,如果你的app有一个demo版本和一个需要收费的版本或者你想在不同配置的设备上都不同的apk。
Gradle使用product flavors(产品的多样化)来创建app的不同版本,每一个app版本可能有不同的特点或者设备需求。Gradle为每一个版本的app产生不同的apk。
构建变种
app的每一个版本在Gradle编译系统中用一个build variant(构建变种)表示。构建变种信息包含了编译类型和产品独特配置(build types和product flavor)。Android studio默认定义了两种编译类型(debug和release),没有定义产品配置。这些默认的项目由两个构建变种组成,debug和release,gradle会为每一个变种生成一个apk。
上面的例子中定义了两个项目配置,escape和tcl,这会产生四个构建变种:
- escape-debug
- escape-release
- tcl-debug
- tcl-release
在编译的时候有四种选择,可以为每一个变种生成相应的apk。
在编译每一个版本的app的时候,Gradle会从下面的目录整合源代码和资源:
- src/main/ 主要的代码目录(对所有的变种都通用)
- src/<buildType>/ 编译类型代码目录
- src/<flavorName> falvor代码目录
flavor代码目录的使用数量是根据工程的flavor配置来决定的:
- 对于没有定义任何flavors的工程,构建系统不会使用任何的flavor代码目录,比如为了产生没有定义flavors的release版本变种,构建系统使用下列目录:
src/main/
src/release/(build type)
- 对于定义了一些flavors的工程,构建系统会使用一个flavor代码目录,例如,产生上面的escape-debug构建变种,构建系统会使用下列目录:
src/main/
src/debug/(build type)
src/escape/(flavor)
这些目录的代码会被共同使用来产生构建变种的输出,可以在不同的目录中存在相同名称的类,只要它们不在同一个变种的构建中使用。构建系统会把所有的manifests整合成一个manifest,所以每一个构建变种都可以定义在manifest中定义不同的组件或者权限。
构建系统会把所有的资源目录组合到一起,如果在一个构建中,不同的目录包含相同名称的资源,优先级顺序为:build type的资源覆盖product flavor的资源,product flavor的资源覆盖main source目录的资源。创建app不同版本的步骤:
1.在build文件中定义product flavors
2.为每一个flavor创建source目录,例如为escape flavor创建以下目录
app/src/escape/java
app/src/escape/res
app/src/escape/res/layout
app/src/escape/res/values
3.为project添加属于flavor的代码和资源