多渠道打包一般应用于向不同应用市场提交app后用来统计不同渠道下载量等一些信息。一般集成友盟sdk(同类型的sdk还有 诸葛io,量江湖等sdk),不同sdk集成方式大同小异,可去各自官网查看详细文档。本文以友盟sdk为例。
渠道:各种应用市场比如 华为应用市场,小米应用市场, 积分墙(花钱的推广渠道)等。
首先集成友盟sdk,集成方式参照友盟sdk集成,在项目的build.gradle文件中加入以下代码
productFlavors {
yingyongbao {}
oppo {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
修改生成的apk名字
applicationVariants.all{ variant->
variant.outputs.each { output->
def oldFile = output.outputFile
if(variant.buildType.name.equals('release')){
def releaseApkName = ''+variant.productFlavors[0].name +"-"+defaultConfig.versionName+ '.apk'
output.outputFile = new File(oldFile.parent, releaseApkName)
}
}
}
在AndroidManifest.xml中加入友盟的集成代码以及权限
<meta-data
android:name="UMENG_APPKEY"
android:value="Your key" />
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" /> //这里改成对应build.gradle中的 productFlavors.all 对应的字符串
然后选择你要打包的渠道就 可以了
->
缺点:如果渠道过多这种打包方式很费时间20个渠道包差不多要40分钟的时间。
一些大厂的渠道会多到惊人,美团会有900+的渠道要是按上面的打包方式2*900肯定是不行的。美团技术大牛们也在一直研究快速多渠道打包方法。
在这介绍美团最新的walle打包,之前美团还有一个打包方式是通过python脚本修改apk(apk也是一个压缩包)中的一个配置文件的名称,配置文件名称也就是渠道名称从而打不不同的包,这种速度很快,但是从android7.0以后android加入了APK Signature Scheme v2打包方式,因为这种打包方式改变的包里面的内容所以apk在7.0以后的系统中安装会提示安装失败。
在此推荐美团walle打包,此种方式是不通过外部修改配置文件的方式打包具体打包细节可参考美团walle打包
集成方式
首先build.gradle中
apply plugin: 'walle'
walle {
// 指定渠道包的输出路径
// apkOutputFolder = new File("${project.buildDir}/outputs/channels");
apkOutputFolder = new File("D:/Android/outputs/user/channels");
// 定制渠道包的APK的文件名称
// apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
apkFileNameFormat = 'app-${channel}-v${versionName}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
dependencies {
compile 'com.meituan.android.walle:library:1.1.6'//美团多渠道打包
}
这里的 channelFile是一个channel(渠道的一个配置文件)放在该工程的对应的目录下
apkOutputFolder 是apk包生成的位置,可更改
该文件用editplus文件编辑器打开格式如下:
然后在 工程的 build.gradle中加入
dependencies {
classpath 'com.meituan.android.walle:plugin:1.1.6'
}
这种打包方式不是更改AndroidManifest的方式,所以先把AndroidManifest中的配置友盟渠道的代码注释掉:
通过调用walle的方法获取到的channel的名称,所以需要在app初始化的 BaseApplication中初始化友盟的channel配置信息。
private void initUmeng(){
String appkey = "your appkey";
String channelId = WalleChannelReader.getChannel(this.getApplicationContext());
//初始化友盟配置信息 通过代码方式配置友盟的渠道信息
MobclickAgent.UMAnalyticsConfig config =
new MobclickAgent.UMAnalyticsConfig(this, appkey, channelId);
}
配置好了那么就开始打包了,在as自带的命令输入框输入打包命令,等两分钟左右所有的渠道包就打完了!
出现BUILD SUCCESSFUL 就说明打包成功了
常用的walle打包命令
//生成所有渠道包
gradlew clean assembleReleaseChannels
// 生成单个渠道包:
gradlew clean assembleReleaseChannels -PchannelList=meituan
//生成多个渠道包:
gradlew clean assembleReleaseChannels -PchannelList=meituan,dianping
如果没有渠道的限制一般用as自带的gradle打包就可以,如果渠道过多推荐使用walle打包。文中介绍的美团的python打包方式现在还有一些开发者在用,因为那种方法在构建基础apk包的时候 不选用v2打包方式是没有问题的,但是我认为v2的签名打包方式更符合现在的趋势吧,所以推荐是用美团的walle打包方式。