关于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
里面设置我们的渠道信息:
步骤四:踩坑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
下面找到你可以使用的命令集合。
所以,我们执行这个assembleSNMAPP__10009DebugChannels
,就会打包成功。