Walle实现Android多渠道打包梳理

关于Walle

Walle(瓦力):Android Signature V2 Scheme签名下的新一代渠道包打包神器

瓦力通过在Apk中的APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,可以作为单机工具来使用,也可以部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。

关于新签名方案和旧签名方案的区别,用一张图概括如下:


区别

github地址:https://github.com/Meituan-Dianping/walle
美团博客地址(Walle原理):http://tech.meituan.com/android-apk-v2-signature-scheme.html

在现有项目中集成

步骤一:配置build.gradle

在位于Android项目的根目录build.gradle(TvTrunkProject) 文件中添加Walle Gradle插件的依赖, 如下:

buildscript {
    dependencies {
        ...
        ...
        classpath 'com.meituan.android.walle:plugin:1.1.6'
    }
}

接着是在当前App的 build.gradle(QQLiveTV_BASE_LINE)文件中apply这个插件,并添加上用于读取渠道号的AAR,如下:

apply plugin: 'walle'

dependencies {
    implementation 'com.meituan.android.walle:library:1.1.6'
}

步骤二:配置插件

build.gradle(QQLiveTV_BASE_LINE) 文件中配置插件,这里的配置可以实现自定义,这里给出的默认值:

walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.buildDir}/outputs/channels")
    // 定制渠道包的APK的文件名称
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk'
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}

步骤三:配置签名

接着我们需要创建一个Signing config来配置我们的签名jks,如图所示:

配置签名

配置完毕之后会在我们的build.gradle(QQLiveTV_BASE_LINE)中自动生成配置信息:

配置信息

步骤三:踩坑1

在配置完签名信息之后直接sync now,则会报异常:ERROR: A problem occurred configuring project ':app'.

产生原因:buildTypes中没有配置我们刚刚创建的签名信息。

解决方法:buildTypes中添加我们的签名信息:

添加信息

在这里需要注意,我们在配置signingConfig signingConfigs.xxx时,xxx必须和我们之前创建的签名信息的名字以及buildTypes中的名称对应,如果配置了多个签名信息则需要创建多个小闭包:

对应

步骤三:踩坑2

当我们执行gradle指令时,报出错误:Could not initialize class org.codehaus.groovy.runtime.InvokerHelper

产生原因: 是由于jdk版本和gradle版本不匹配。在使用Oracle JDK 14时,所有gradle(6.2.2)任务都会失败。

解决方法: 降低jdk版本或者提高gradle版本到6.3及以上。

步骤四:设置渠道信息

我们在proj.android[QQLiveTV_BASE_LINE]目录下创建一个名为channel的file,并在channel里面设置我们的渠道信息:

channel

步骤四:踩坑1

在创建channel时不能添加后缀.txt,否则执行打包的时候不能读取到渠道信息,即只能打出一个包。

步骤五:执行打包

生成渠道包的方式是和assemble${variantName}Channels指令结合,渠道包的生成目录默认存放在 build/outputs/apk/,也可以通过walle闭包中的apkOutputFolder参数来指定输出目录

用法示例:

生成渠道包 gradlew clean assembleReleaseChannels
支持productFlavors gradlew clean assembleMeituanReleaseChannels
生成单个渠道包 gradlew clean assembleReleaseChannels -PchannelList=anzhuo
生成多个渠道包 gradlew clean assembleReleaseChannels -PchannelList=wandoujia,baidu

正常情况下我们直接执行指令gradlew clean assembleReleaseChannels即可打出所有渠道包。

步骤五:踩坑1

在执行打包指令时报出错误:Task 'assembleReleaseChannels' not found in root project TvTrunkProject ''.

产生原因: 项目之前的打包方式是采用productFlavors进行多渠道打包。

错误解决方法: 在网上查看相关blog,说是直接将productFlavors中相关配置直接注释掉即可,但是经过实测,光注释掉productFlavors相关配置只是治标不治本,后续产生的错误会更多。

正确解决方法: 查看Walle仓库的issue,发现Walle本身是支持在配置productFlavors时一键生成多个渠道包,所以根本原因并不是productFlavors。解决方法描述如下:

可以检查有没有配置productFlavors,如果有,需要在assemble{$flavor.name}ReleaseChannels.另外还可以在AndroidStudio, Gradle->Project->{your app module name} -> package下面找到你可以使用的命令集合。

gradle指令

所以,我们执行这个assembleSNMAPP__10009DebugChannels,就会打包成功。

执行指令

successful
打包成功

你可能感兴趣的:(Walle实现Android多渠道打包梳理)