多渠道打包的概念:

  打包是指使用证书文件对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. MySQL基础笔记(五) 视图

    一.什么是视图 视图是一个虚拟表.也就是说,视图在外观和行为上都类似于表,但它不需要实际的物理存储,只保存了视图定义(查询语句). 视图由select查询所定义 -- 当创建一个视图时,实际上是在数据 ...

  2. Linux Shell_test

    test: 测试Shell脚本里的条件,通过推出状态返回其结果.用法:    test [ expression ] 或 [ [ expression ] ]    注意空格test表达式:是则为真  ...

  3. c语言实现输出一个数的每一位

    比方输入1234.在屏幕上打印出1 2 3 4 代码展示: 方法一: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #includ ...

  4. anaconda中新rdkit安装

    1. 执行 conda create -c rdkit -n my-rdkit-env rdkit 该步骤经测试发现需FQ,而模拟器无法完成FQ(至少我不知道方法), 因此在本机上配置好环境后复制粘贴 ...

  5. 本人会linux系统的各种版本的安装,近期发教程

    小弟虽然刚刚踏入职场,可是咱大学也不是打酱油过的啊,研究过各种版本系统的安装,也都均已经实践,勿喷,有问题 咱们可以相互探讨!

  6. kernel: audit: printk limit exceeded

    问题: 小长假的第一天早上8:18一个数据,被定时任务中的脚本漏处理: 查定时任务的日志,发现调度异常 查var messages-20171231 日志信息,排查问题. http://man7.or ...

  7. windows安装SVN服务器并设置开机启动

    1.安装SVN服务器,到http://subversion.apache.org/packages.html上下载windows版的SVN,并安装,在命令行下运行svn命令,如下所以,则svn服务器安 ...

  8. UITabBarController简单介绍

    一.简单介绍 UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例 ...

  9. Java 内存管理、JVM 工作原理与 Java 运行时系统

    Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...

  10. bzoj 4521 电话号码

    题目大意: 求$[L,R]$中,满足不同时存在4和8且有连续三个一样的个数 思路: 我为什么要记忆化搜索里带-1啊 我可真是个** 直接记忆化搜索记前两位是否有4,8以及是否满足连续 #include ...