上篇文章《Android 如何使用gradle.properties》
记录了如何使用gradle.properties
实现与build.gradle
之间的配置与交互。这篇文章来看下如何用build.gradle实现多渠道打包。
我们知道打包的流程包括:签名配置、渠道配置、构建几个方面。通常App发布的时候会根据产品以及运营的需求对每个应用商店的渠道进行区分,需要打无数个包,那岂不是疯了?
那方案有哪些呢?
gradle
自己构建前两个都有官网和大量的方案教程,这里记录下gradle
自己实现,以防忘记以供以后参考。
1. 签名配置
在build.gradle
中签名信息一般都写在signingConfigs
中,例如:
signingConfigs {
debug { // debug签名配置
storeFile file(STORE_FILE)//密钥文件路径
storePassword STORE_PASSWORD//密钥文件密码
keyAlias KEY_ALIAS//key别名
keyPassword KEY_PASSWORD//key密码
}
release {//发布版签名配置
storeFile file(STORE_FILE)//密钥文件路径
storePassword STORE_PASSWORD//密钥文件密码
keyAlias KEY_ALIAS//key别名
keyPassword KEY_PASSWORD//key密码
}
}
在这里debug
和release
中的签名可以不一样,签名文件的信息可以配置在gradle.properties
中,也可以在这里面直接写。
2.多渠道配置
在多渠道信息配置过程中,需要经过多渠道名称配置、多渠道打包后的apk名配置。
productFlavors
,如下:productFlavors {
xiaomi {}
huawei {}
oppo {}
_360{} // 不能以数字开头
}
这样每个渠道就设置完了,{}
中可以写每个渠道不同的配置。这时候我们会想,如果每个渠道需要配置的信息都一样怎么办呢?下面说下统一配置。
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [
APP_NAME: APP_NAME,
CHANNEL : name]
}
在这里我们配置了两个属性APP_NAME、CHANNEL
,也可以根据项目的需要设置其他属性。
applicationVariants.all { variant ->
variant.outputs.all { output ->
def buildName = "multi-channel"
def type = variant.buildType.name
def releaseApkName
releaseApkName = buildName + '_' + productFlavors.name + '_' + type + "_" + "${defaultConfig.versionName}" + '.apk'
outputFileName = releaseApkName
}
}
这里最终生成的apk名字结构为multi-channel_[huawei]_release_1.1.apk
.当然也可以加入构建时间等参数,这个看项目需要。
buildTypes {
debug {
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
}
release {
minifyEnabled true // 混淆开启
zipAlignEnabled true // 压缩开启
shrinkResources true // 移除无用资源
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release//设置签名信息
}
}
到这里差不多就结束了,build
一下吧。我擦报错了?!
ERROR: All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
Affected Modules: app
这是什么意思呢,经过上面的链接我们可以了解大概就是需要设置一个默认的统一纬度
android {
defaultConfig {
flavorDimensions "versionName" // 为了让多渠道包间的纬度统一,写渠道名写其他都可以。
}
}
再构建下,OK完成,我们愉快的打包吧。
使用命令:
执行./gradlew assembleRelease
,生成所有渠道的release包;
执行./gradlew assembleXiaomi
,生成小米渠道的release和debug版的包;
执行./gradlew assembleXiaomiRelease
生成小米的release包。
也可以通过AndroidStudio
上有侧边栏Gradle/Tasks/build/
下面的assemble
相关的命令直接点击即可。
gradle
多渠道打包设置差不多结束了,最后放上build.gradle
代码:apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId APPLICATION_ID
minSdkVersion 17
targetSdkVersion 28
versionCode VERSION_CODE as int
versionName VERSION_NAME
// 通过buildConfigField自定义配置信息
buildConfigField("String", "BASE_API", "${BASE_API}")
// buildConfigField("String", "CHANNEL", "${CHANNEL}")
buildConfigField("boolean", "LOG_SWITCH", "${LOG_SWITCH}")
// // 在清单文件中需要引用的参数
// manifestPlaceholders = [
// APP_NAME: APP_NAME,
// CHANNEL : CHANNEL]
flavorDimensions "versionName" // 为了让多渠道包间的纬度统一
}
//签名配置
signingConfigs {
debug { // debug签名配置
storeFile file(STORE_FILE)//密钥文件路径
storePassword STORE_PASSWORD//密钥文件密码
keyAlias KEY_ALIAS//key别名
keyPassword KEY_PASSWORD//key密码
}
release {//发布版签名配置
storeFile file(STORE_FILE)//密钥文件路径
storePassword STORE_PASSWORD//密钥文件密码
keyAlias KEY_ALIAS//key别名
keyPassword KEY_PASSWORD//key密码
}
}
// 构建配置
buildTypes {
debug {
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
}
release {
minifyEnabled true // 混淆开启
zipAlignEnabled true // 压缩开启
shrinkResources true // 移除无用资源
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release//设置签名信息
}
}
// 多渠道打包配置名称
applicationVariants.all { variant ->
variant.outputs.all { output ->
def buildName = "multi-channel"
def type = variant.buildType.name
def releaseApkName
releaseApkName = buildName + '_' + productFlavors.name + '_' + type + "_" + "${defaultConfig.versionName}" + '.apk'
outputFileName = releaseApkName
}
}
// 渠道配置
productFlavors {
xiaomi {}
huawei {}
_360 {}
wandoujia {}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [
APP_NAME: APP_NAME,
CHANNEL : name]
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}