前言
美团的walle打包方案是基于Android Signature V2 Schme 签名下的新一代渠道包打包神器,他通过在ApkSignNature Block 区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包的生成效率。也就是说只需要编译打包一次,然后每个渠道复制一次,再往里面添加渠道信息。这样大大提高了打包的速率。
如果有想了此工具原理的同学,可以参考 新一代开源Android渠道包生成工具Walle。
美团walle打包的方式
1.通过gradle进行集成(本文着重介绍)
2.通过命令行使用(命令行wiki)
基于gradle 集成的方式
配置build.gradle
在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖, 如下:
buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.1.7'
}
}
并在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.7'
}
配置插件
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")
}
配置项具体解释:
apkOutputFolder:指定渠道包的输出路径, 默认值为new File("${project.buildDir}/outputs/apk")
channelFile:包含渠道配置信息的文件路径。
apkFileNameFormat:定制渠道包的APK的文件名称, 默认值为'${appName}-${buildType}-${channel}.apk'
可使用以下变量:
projectName - 项目名字
appName - App模块名字
packageName - applicationId (App包名packageName)
buildType - buildType (release/debug等)
channel - channel名称 (对应渠道打包中的渠道名字)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)
fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
flavorName - 编译构建 productFlavors 名
我的channelFile如下:
image.png
生成/获取渠道信息
- 获取渠道包
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
- 生成渠道包
生成渠道包的方式是和assemble${variantName}Channels
指令结合,渠道包的生成目录默认存放在build/outputs/apk/
,也可以通过walle
闭包中的apkOutputFolder
参数来指定输出目录
用法示例:
生成渠道包./gradlew clean assembleReleaseChannels
支持 productFlavors./gradlew clean assembleMeituanReleaseChannels
-
AS右侧点开Gradle工具栏,如下图所示,双击运行Task任务
image.png
生成的APK渠道包,可以根据Walle配置文件路径查找
image.png
配合友盟统计的使用
友盟统计之前的多渠道统计方式是在AndroidManifast.xml文件中配合Gradle脚本productFlavors实现的多渠道信息集成的。如果使用walle,productFlavors不存在了,就算没有删除通过原有的获取渠道信息的方式获取到的渠道信息也不对了,所以需要动态去获取
String channel = WalleChannelReader.getChannel(applicationContext);
UMConfigure.init(mContext, Constants.UMENG_KEY, channel, UMConfigure.DEVICE_TYPE_PHONE, "");
网友评论