多渠道打包的概念:

  打包是指使用证书文件对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. Deepin-文件目录介绍

    请参见这篇文件:来自一个强大的网站 我主要介绍的就是: 下面所列文件,全部添加进了path目录(Linux查找命令,请参见man.linux,无论是find 或者是 which等) Deepin默认可 ...

  2. freemarker 模板

    1 整体结构 模板(FTL 编程)是由例如以下部分混合而成的: Text 文本:文本会照着原样来输出. Interpolation 插值:这部分的输出会被计算的值来替换.插值由${和}所分隔(或者#{ ...

  3. C语言最小生成树prim算法(USACO3.1)

    /* ID: hk945801 LANG: C++ TASK: agrinet */ #include<iostream> #include<cstdio> using nam ...

  4. java实现从报文中获取投保单号

    java实现从报文中获取投保单号 投保单号正则表达式: String regex = "<proposalNo>([0-9]+)</proposalNo>[\\s\\ ...

  5. Oracle11g表空间导入dmp数据

    如果你的表数据没有附带表空间和用户名,那么只要一句话 Imp {u_name}/{u_pwd}@{local_svrname} fromuser={from_user} touser={u_name} ...

  6. 关于axis2.1.6与websphere7的包冲突问题的解决方式

    1,复制axis2.1.6内的module目录内的全部文件到lib 并改动扩展名为.jar 2,删除module目录(可选,不删除也能够) 3,部署到was 4,设置was相应应用程序的类载入方案为父 ...

  7. Unity即将到来的2D工具

    孙广东  2015.7.5 看了一下对功能介绍的视频,确实功能强大. 可是须要FQ在youtube上观看,所以就下载下来了.能够浏览一下: http://www.iqiyi.com/playlist2 ...

  8. Form content types

    Forms in HTML documents https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4 17.13.4 Form con ...

  9. 算法4-10:BST平衡二叉树的删除操作

    偷懒方法 public void delete(Key key) { insert(key, null); } 这样的方法就是将key相应的值覆盖成null.当读取该键值的时候将会返回null. 这是 ...

  10. HDU - 1863 畅通工程(最小生成树)

    d.m个村庄,n条路,计算出所有村庄畅通需要的最低成本. s.最小生成树 c.Prim算法:cost[a][b]和cost[b][a]都得赋值. /* Prim算法 Prim求MST 耗费矩阵cost ...