多渠道打包的概念:

  打包是指使用证书文件对app签名生成一个apk文件。

  多渠道打包指的就是我们的app在开发完成之后需要投放到不同的市场,比如说Google市场、百度市场等,为了统计应用在各个市场的用户下载量、新增用户量等数据,需要把他们打包成不同的包投放到不同的市场,每种包都包含了各自市场的信息。

多渠道打包的实现:

  目前多渠道打包主要有两种实现方式:一种就是gradle变量动态替换,第二种就是第三方公司推出的批量打包方案。

gradle动态变量替换:

  首先,将manifest文件中的meta-data标签的value值用占位符替换。即${channel}

<meta-data android:name="UMENG_CHANNEL" android:value="${channel}" />

  然后,在build.gradle文件中,添加productFlavors节点,配置变量的所有取值集合。

//渠道配置,通过产品微调的功能来配置
productFlavors {
//添加一个产品配置项,名称是WanDouJiaChannel
WanDouJiaChannel {
//表示清单文件中有一个占位符channel,编译的时候会将它的值替换为wandoujia
manifestPlaceholders = [channel:"wandoujia"]
}

//再添加一个小米AppStore渠道
XiaoMiChannel {
manifestPlaceholders = [channel:"xiaomi"]
}

//再添加一个应用宝渠道
YingYongBaoChannel {
manifestPlaceholders = [channel:"yingyongbao"]
}

//...为所有渠道添加配置
}

  最后,通过打包生成全部的apk文件。

美团自动化打包:

  原理:先准备一个签过名的apk文件,然后复制多个apk文件,再向每个apk文件的META-INF目录中写入空文件,而这个文件的名称正好命名为渠道名。这样下来,每个apk文件的META-INF目录下都有一个标识了渠道名称的空文件。然后我们在app代码中,动态读取META-INF目录下的那个空文件,就获取到了渠道名,然后传递给友盟SDK。

  具体做法如下:

  在美团提供的工具中,channel.txt文件是所有的取到信息,如果需要新的,则在下面继续添加。包内有一个MultiChannelBuildTool.py文件这个文件是用python写的脚本程序,作用是读取channel中的渠道信息,然后赋值很多个apk文件,再将读取的取到信息一次写入每个apk文件的META-INF目录下,就是那个空文件。在app代码中,我们使用美团提供的ChannelUtil工具类,读取出META-INF目录下的空文件,得到当前app的渠道信息,因此原来manifest文件中的meta-data的取到标签要去掉了,原来gradle的那些渠道信息配置也都要删除。代码如下:

//获取META-INF目录下的渠道信息
String channel = ChannelUtil.getChannel(this);
//将渠道信息设置给UmengSDK
String appKey = "58b7fe1aae1bf82ad4001a1d";
MobclickAgent.UMAnalyticsConfig config = new MobclickAgent.UMAnalyticsConfig(this,appKey,channel);
MobclickAgent.startWithConfigure(config);

代码编写完成之后,导出一个签名的apk文件,然后放到PythonTool目录下,该apk文件目前没有任何渠道信息,只是功python脚本来复制用的。

最后,双击执行MultiChannelBuildTool.py文件,当然前提是安装python运行环境。此时会复制出所有apk文件,并且每个apk文件的META-INF目录下都会出现新的空文件,文件名就是渠道名。

个人总结:app多渠道打包主要有这么两种方式,一种是gradle替换动态变量的方式,主要实现是首先在清单文件的applcation节点下添加meta-data条目,并且将其value值设置为占位符(${channel}),然后去build.gradle文件中添加productFlovars节点,在该节点下添加各个渠道的信息,最后打包即可。还有一种是通过第三方的工具来实现。用的多的就是美团的自动打包工具。它的实现原理主要是:我们的apk文件一旦被修改就需要重新签名,而当我们在apk文件的META-INF目录下添加一个空文件的时候却不需要重新签名。美团打包工具就是利用了这个特性来实现打包,节省打包时间。主要实现是通过一个python的脚本工具。

首先在app中添加代码,获取META-INF目录下空文件的文件名,这个文件名就是对应的渠道信息。然后将一个没有取到信息的安装包使用脚本工具生成多个安装包。

APP多渠道打包的更多相关文章

  1. Android学习探索之App多渠道打包及动态添加修改资源属性

    前言: 关于Android渠道打包是一个比较老的话题,今天主要记录总结一下多渠道打包以及如果动态配置修改一些资源属性.今天以公司实际需求为例进行演示,由于项目复用很多公共的业务组件,而且业务组件之间的 ...

  2. Android 多渠道打包原理和使用

    每次中午吃饭总会和技术同学聊天.当做 iOS 开发的做安卓开发的人员在一起的时候,他们中间又多了一个话题:iOS 开发难还是安卓开发难. 这个时候做安卓开发的同学最激动说安卓开发要自己画界面.机型复杂 ...

  3. 柔弱的APP如何自我保护,浅谈APP防御手段,使用360加固助手加固/签名/多渠道打包/应用市场发布

    柔弱的APP如何自我保护,浅谈APP防御手段,使用360加固助手加固/签名/多渠道打包/应用市场发布 由于JAVA和Android的平台型,所以APP很容易被反编译,这对于我们开发者来说,是一个不想要 ...

  4. Android Studio 多个编译环境配置 多渠道打包 APK输出配置

    看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...

  5. 更便捷的Android多渠道打包方式

    本文先回顾了以往流行的多渠道打包方式,随后引入的mcxiaoke的packer-ng-plugin项目,介绍该项目在实际应用(配合友盟统计)中如何解决更方便的Android多渠道打包问题 多渠道打包方 ...

  6. Android Studio + gradle多渠道打包

    通过工具栏的Build->Build Apk 好像只能打包第一个Module(eclipse里面是Project的概念),怎么多渠道打包呢?目前好像只能一个一个的打 首先在清单文件里设置个变量: ...

  7. Gradle多渠道打包[umeng]

    前言 国内Android应用市场品种太多,血统不纯,每次上线App都打包打到手软,上传上到吐血!好在我们有了Android studio和gradle,一条命令打包各种渠道版本App! 正文 Umen ...

  8. Android 新一代多渠道打包神器

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:李涛 ApkChannelPackage是一种快速多渠道打包工具,同时支持基于V1签名和V2签名进行多渠 ...

  9. android 7.0 多渠道打包 - 美团开源工具Walle 命令行打包

    在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2后,之前快速生成渠道包的方式(美团Android自动化之旅-生成渠道包)已经行不通了,对此美 ...

随机推荐

  1. UVA 4857 Halloween Costumes 区间背包

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  2. Deepin-安装node

    点击下载:Linux x64 文件解压: 方式1$xz -d file.tar.xz $tar -xvf file.tar 方式2 $tar xvJf file.tar.xz 解压后,把它移动到:/u ...

  3. Linux—read

    read:将信息读入一个或多个Shell变量    语法格式:read [-r] 变量名    选项:        -r:原始读入,不做任何处理,不将结尾结尾处的反斜杠解释为续行字符    行为模式 ...

  4. 在CentOS上把MySQL从5.5升级到5.6

    在CentOS上把MySQL从5.5升级到5.6 摘要:本文记录了在CentOS 6.3上,把MySQL从5.5.28升级到5.6.19的过程. 1. 概述 在我做的一个项目中,最近我对生产服务器上的 ...

  5. windows下Python扩展问题error: Unable to find vcvarsall.bat

    由于对于Windows下Python扩展不熟,今天遇到一个安装问题,特此做个tag.解决方式在stackoverflow上,网址例如以下: http://stackoverflow.com/quest ...

  6. 【iOS系列】-文件管理

    OC中操作文件,需要使用NSFileManager: 需要使用NSFileManager的创建方式: //单例模式创建对象 NSFileManager * f2 = [NSFileManager de ...

  7. 2016/3/20 数组定义 数组遍历 超全局数组 数组元素设置(in_array() 、array_reverse()、count()、array_unique()、unset()、array_values、array_merge、array_push) 列表实例

    一.数组定义 php数组与其他语言的数组的不同: 其他例如java语言 :同一种类型数据的集合. php:数组可以存储任何类型的数据.同一个数组中可以放int类型也可以放string类型 ①索引数组的 ...

  8. [NOIP2012] day2 T3疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到 ...

  9. Latex 1: 解决latex中遇到一个常见错误:"Improper alphabetic constant."

    1.问题: 本人是在WIN7下用texlive 2016,编辑器用的是WinEdt 10.1 ,运行如下代码: \documentclass{ctexbook} \begin{document} \t ...

  10. spring 简述

    Spring的发展 1.1. Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和x ...