Android开发使用Gradle实现多渠道打包

上篇文章《Android 如何使用gradle.properties》
记录了如何使用gradle.properties实现与build.gradle之间的配置与交互。这篇文章来看下如何用build.gradle实现多渠道打包。

我们知道打包的流程包括:签名配置、渠道配置、构建几个方面。通常App发布的时候会根据产品以及运营的需求对每个应用商店的渠道进行区分,需要打无数个包,那岂不是疯了?
那方案有哪些呢?

  1. 360等一些第三方的多渠道打包
  2. 美团多渠道打包实现方案
  3. 使用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密码
    }
}

在这里debugrelease中的签名可以不一样,签名文件的信息可以配置在gradle.properties中,也可以在这里面直接写。

2.多渠道配置

在多渠道信息配置过程中,需要经过多渠道名称配置、多渠道打包后的apk名配置。

  • 多渠道配置需要用到productFlavors,如下:
productFlavors {
	xiaomi {}
	huawei {}
	oppo {}
	_360{}  // 不能以数字开头
}

这样每个渠道就设置完了,{}中可以写每个渠道不同的配置。这时候我们会想,如果每个渠道需要配置的信息都一样怎么办呢?下面说下统一配置。

  • 统一配置多渠道信息
productFlavors.all { flavor ->
	flavor.manifestPlaceholders = [
		APP_NAME: APP_NAME,
 		CHANNEL : name]
}

在这里我们配置了两个属性APP_NAME、CHANNEL,也可以根据项目的需要设置其他属性。

  • 配置构建后apk的文件名称
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相关的命令直接点击即可。

Android开发使用Gradle实现多渠道打包_第1张图片
最后生成的包如下图:
Android开发使用Gradle实现多渠道打包_第2张图片

  • 到这里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'
}

你可能感兴趣的:(android)