Build Variants 构建变体
通过变体名称组合规则free(版本)+ domestic(地区)+ Release(类型)free(版本)+ overseas(地区)+ Debug(类型)paid(版本)+ domestic(地区)+ Debug(类型)
在Build Variants面板中,当前模块的所有可用变体
变体组合规则: ProductFlavor + BuildType ,其中BuildType默认有debug、release。
多维度变体组合
维度定义与组合
通过flavorDimensions实现多维度变体(如版本+地区):
flavorDimensions "version", "area"
productFlavors {
free { dimension "version" }
paid { dimension "version" }
domestic { dimension "area" }
overseas { dimension "area" }
}
生成变体示例:
| 变体名称 | 组合规则 |
|---|---|
freeDomesticRelease |
free(版本)+ domestic(地区)+ Release(类型) |
freeOverseasDebug |
free(版本)+ overseas(地区)+ Debug(类型) |
paidODomesticDebug |
paid(版本)+ domestic(地区)+ Debug(类型) |
源集类型
main 源集包含了所有其他构件变体共用的代码和资源,即所有的其他构建变体,src/main是其共同拥有的。
其他源集目录为可选项,如果想要为某个单独的构建变体添加特有的代码或者资源,可以创建对应的目录。
变体专属资源需放置在对应目录(如src/freeRelease/res/),变体目录与main目录平级。
资源优先级
当存在重复的资源时,Gradle 将按以下优先顺序决定使用哪一个文件(左侧源集替换右侧源集的文件和设置):构建变体 > 构建类型[BuildType] > 产品风味[ProductFlavor] > 主源集[main] > 库依赖项。
- java/ 目录中的所有源代码将一起编译以生成单个输出。注意的是,java文件是不能被覆盖的,如果在main目录中创建了src/main/Utility.java,那么是不能其他源集目录中定义同名文件进行覆盖的,因为Gradle 在构建过程中会查看这两个目录并抛出“重复类”错误。如果想要在不同的 build 类型有不同版本的 Utility.java,只能让每个 build 类型定义各自的文件版本。
- 所有Manifest都将合并为一个清单。合并的优先级和上面提到的一致。
- 同样,values/ 目录中的文件也会合并在一起。如果两个文件同名,例如存在两个 strings.xml 文件,按照上述的优先级覆盖。
- res/ 和 asset/ 目录中的资源会打包在一起。
- 最后,在构建 APK 时,Gradle 会为库模块依赖项随附的资源和清单指定最低优先级。
源集过滤
sourceSets {
main {
java {
exclude ‘com/cooke/library/Test.java’
exclude ‘com/cooke/library/model/**.java’
}
}
}
上面例子提到,其他的源集目录无法覆盖同名java文件,但是可以通过SourceSet对main目录中的java进行exclude。
注意:include和exclude不能对res生效,如果想要对res进行过滤,需要通过定义res/raw/keep.xml。
重命名apk文件
遍历applicationVariant或libraryVariant列表,干预构建apk和aar的过程。最常见的就是重命名apk的名称:
android.applicationVariants.all {
variant ->
variant.outputs.all {
outputFileName=“{applicationId}_̲{buildType.name}_{versionName}_̲{releaseTime()}.apk”
}
}
定制依赖
Build Type,Product Flavor也能够有它们自己的依赖关系。比如,使用flavor来生成一个基于广告的应用版本和一个付费的应用版本,当中广告版本依赖于一个广告SDK。
dependencies {
flavor1Compile "..."
}
定制权限
在风味目录下单独定制AndroidManifest.xml。
定义常量
在gradle.properties文件中可以定义常量,例如
isMoudle=true
然后在Android项目中的任何一个build.gradle文件中都可以把gradle.properties中的常量读取出来,通过读取这个常量的值来判断开发模式,例如:
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
更多推荐

所有评论(0)