盒子
盒子
Posts List
  1. 一.定义buildTypes
  2. 二.定义productFlavors
  3. 三.variant说明
  4. 四.资源合并
  5. 五.合并不同flavor的java代码

gradle实践系列:android gradle插件(3)

本篇重点说明打包apk的参数设置,一个apk的完整参数定义,官方称之为variant。一个variant由一个buildType和一个flavor组成。

一.定义buildTypes

buildTypes语句块定义了apk打包的类型,主要包括定义签名信息和混淆配置相关。
完整的属性定义可以在这里查到
http://google.github.io/android-gradle-dsl

默认情况下buildTypes包含debug和release两种类型

buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.debug
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
applicationIDsuffix '.debug'
versionNameSuffix '-debug'
}
}

minifyEnabled 表示是否开启混淆
shrinkResources 表示是否开启资源优化

applicationIDsuffix 表示debug包的packageName后面自动添加.debug,比如我们的packageName是com.hch,打出的debug包的packageName则是com.hch.debug,这样两个包都可以安装到同一个手机上

二.定义productFlavors

productFlavors能够定义产品的版本信息,具体包括:

  • applicationId
  • minSdkVersion
  • targetSdkVersion
  • versionCode
  • versionName
  • signingConfig
productFlavors {
arrogant {
applicationId 'com.hch.babyenglish.arrg'
}
friendly {
applicationId 'com.hch.babyenglish.frnd'
}
obsequious {
applicationId 'com.hch.babyenglish.obsq'
}
}

每一个variant都可以有单独的java和res文件夹

image

三.variant说明

flavor和buildType组合能完整定义一个apk产品信息,官方称一个flavor和一个buildType的组合为variant。
查看所有variant的方法:

task printVariantNames(){
doLast{
android.applicationVariants.all {
variant -> println variant.name
}
}
}
gradlew -q printVariantNames

输入如下

:app:printVariantNames
obsequiousDebug
obsequiousRelease
arrogantDebug
arrogantRelease
friendlyDebug
friendlyRelease

我们可以通过 gradlew assemble 来打特定的apk包,如

gradlew -q assembleObsequiousRelease

也可以打所有相同flavor的包 gradlew assemble 如:

gradlew -q assembleObsequious

这样会同时打出obsequiousDebug和obsequiousRelease的apk

同样,还可以直接打所有相同buildType的包 gradlew assemble 如:

gradlew -q assembleRelease

我们也可以用android studio直接导出apk包,在导出时,选择buildType和flavor

image

四.资源合并

如果定义了不同的flavor,则每个flavro可以有自己的代码和资源,可以打包出不同样式和内容的apk。

在生成apk时,buildType , flavor和主文件夹中的非java文件类资源,如果存在相同目录下的相同资源名文件,则会出现覆盖,优先级是:buildType > flavor > 主文件夹。

例如:我们在 obsequious 中定义一个strings.xml,如果要生成obsequious的包,则会用obsequious/res/strings.xml覆盖main/res/strings.xml

五.合并不同flavor的java代码

java文件的合并不同于资源合并,如果在main文件夹中存在对A.java的引用,则我们可以在不同的flavor中实现A.java,从而实现不同的功能。

image


下一篇

gradle实践系列:android gradle插件(4)

支持一下
扫一扫,支持牛头码农