美团多渠道打包方案详解,速度快到白驹过隙

Andorid渠道市场有多分散呢?分散到比Android碎片化还严重,你还在为多渠道打包而头疼吗?美团提供了速度快到白驹过隙的多渠道打包方案。说的有点夸张,对,虽然夸张,但是确实很快,不夸张不足以形容其快。废话不多说,先讲原理,再讲实践方法。

新旧打包方法原理对比讲解

传统方式

在AndroidManifest定义渠道的年代,多渠道打包无非以下两种方案:

  • 方案一:完全的重新编译,即在代码重新编译打包之前,在AndroidManifest中修改渠道标示;

  • 方案二:通过ApkTool进行解包,然后修改AndroidManifest中修改渠道标示,最后再通过ApkTool进行打包、签名。

这两种打包方式,不管是哪种,效率都很低,方案一毫无效率可言,而且打包的渠道规模非常小,第二种方案效率稍微高些,打包的渠道规模也还可以,但是这两种方案速度慢的惊人,如果你打个上百的渠道包试试,估计你的电脑能卡一下午。慢,当然也有好处,你可以不用工作了,喝着咖啡,玩着手机慢慢等也很惬意是不?哈哈……

美团高效的多渠道打包方案

美团高效的多渠道打包方案是把一个Android应用程序包当作一个zip文件包进行解压,然后发现在签名生成的目录下添加一个空文件,空文件用渠道名来命名,而且不需要重新签名。这种方式不需要重新签名,编译等步骤,使得这种方法非常高效。

第一步:解压apk文件

我们直接解压apk,解压后的根目录会有一个META-INF目录,如下图所示:

如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。

第二步:用python脚本向apk文件中添加空渠道文件

我们用python代码来给apk添加空的渠道文件,渠道名的前缀为mtchannel_:

import zipfile zipped = zipfile.ZipFile(your_apk, 'a', zipfile.ZIP_DEFLATED)  empty_channel_file = "META-INF/mtchannel_{channel}".format(channel=your_channel) zipped.write(your_empty_file, empty_channel_file)

添加完空渠道文件后的目录,META-INFO目录多了一个名为mtchannel_meituan的空文件:

第三步:用java代码读取渠道名,并动态设置渠道名

我们用脚本生成了文件之后,文件的名字是用渠道名来命名的,所以我们在启动程序的时候,可以用java代码动态读取渠道名,并动态的去设置。
java代码读取渠道名的方法:

public static String getChannel(Context context) {ApplicationInfo appinfo = context.getApplicationInfo();String sourceDir = appinfo.sourceDir;String ret = "";ZipFile zipfile = null;try {zipfile = new ZipFile(sourceDir);Enumeration<?> entries = zipfile.entries();while (entries.hasMoreElements()) {ZipEntry entry = ((ZipEntry) entries.nextElement());String entryName = entry.getName();if (entryName.startsWith("mtchannel")) {ret = entryName;break;}}} catch (IOException e) {e.printStackTrace();} finally {if (zipfile != null) {try {zipfile.close();} catch (IOException e) {e.printStackTrace();}}}String[] split = ret.split("_");if (split != null && split.length >= 2) {return ret.substring(split[0].length() + 1);} else {return "";}}

读取到了渠道名,我们就可以动态的设置了,比如友盟渠道的动态设置方法是:AnalyticsConfig.setChannel(getChannel(Context context) );这样就好了。这种方式每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件即可。这种打包方式速度非常快,据说900多个渠道不到一分钟就能打完。我亲测的是我用了10秒钟打了32个渠道包,是不是很快。

实践使用

你可能会说,我看不懂上面的python代码,那个脚本里的内容看不明白,这个没关系。你仔细明白了原理即可,因为有人给你造轮子,我们直接骑就可以了。

实践方法使用

第一步:配置python环境

我们既然需要使用脚本打包,那么相应的电脑上必须有可以运行python脚本的运行环境。所以我们第一步是要配置python运行环境。
自己去官网下载安装即可,非常简单。官网地址:https://www.python.org/

第二步:设置python脚本并把封装好的类放到工程里

好心人已经把运行的打包脚本写好了,并且也封装了读取渠道号的实体工具类。大家只需要去github上下载即可。
地址:https://github.com/GavinCT/AndroidMultiChannelBuildTool
当然在github上也有相关的使用介绍,非常简单,一看就懂。这里简单说下,下载下来有个ChannelUtil.java类,里面封装好了获取渠道号的方法,你只需要在启动应用程序的地方调用友盟的设置代码即可,比如:AnalyticsConfig.setChannel(ChannelUtil.getChannel(this))。

第三步:配置渠道列表

我们在github上把轮子下载下来之后,你解压文件,在PythonTool/Info/channel.txt中编辑渠道列表,没写一个渠道名,换行即可。

第四步:复制签好名的包,运行脚本

你把你已经签名打包好的apk文件,复制到PythonTool目录下和MultiChannelBuildTool.py这个脚本同级,直接双击点击MultiChannelBuildTool.py即可完成打包。

ok,到这里基本就讲完了,讲了讲原理,又讲了讲实践方式,鉴于别人都给你造好轮子了,所以使用起来非常简单,赶紧去试一试吧。如果不明白的可以留言,欢迎一起交流。

推荐文章:

Android Studio 使用Gradle多渠道打包

参考文章:
http://tech.meituan.com/mt-apk-packaging.html

【转自】非著名程序员

转载于:https://blog.51cto.com/wlwenming/1790279

美团多渠道打包方案详解,速度快到白驹过隙相关推荐

  1. android打包工具多渠道批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案...

    今天写一篇文章来总结下android批量打渠道包美团版本.之前项目上一直用的是gradle 批量打包方式,那个速度啊真是令人发指,15个渠道得跑上半个小时,出去吃顿饭回来,还在跑.特别是赶上项目上线的 ...

  2. android 美团批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案

    今天写一篇文章来总结下android批量打渠道包美团版本.之前项目上一直用的是gradle 批量打包方式,那个速度啊真是令人发指,15个渠道得跑上半个小时,出去吃顿饭回来,还在跑.特别是赶上项目上线的 ...

  3. android 美团多渠道打包方案

    问:为啥要多渠道打包,只打一个包,然后分别发布到不同的平台上,不也挺好吗? 答:不同渠道打包主要用来做统计分析,特别是游戏应用,特别注意哪个渠道推广的最有效. 基于上面的场景,我们发现主要有两个问题: ...

  4. android百度多渠道打包,Android多渠道打包方案的实践与优化

    目前使用过的多渠道打包方式有两种 ,一种是通过gradle打包,还有一种是美团的多渠道打包方案具体详情见这里 1.Gradle打包 1.1.在Androidmanifest.xml中添加 androi ...

  5. 多渠道打包方案,其实很有玄机

    /   今日科技快讯   / 近日,华为乌克兰分公司发表公报说,公司已经中标乌克兰首都基辅地铁4G网络建设项目.华为中标的项目是其在中东欧和斯堪的纳维亚地区最大的地铁通信项目. /   作者简介    ...

  6. 一个美团快速打包方案

    关于Android快捷高速的打包方式--美团多渠道打包方案 为什么要渠道打包,一个包不是挺好的吗,一个包也可以发布到各个应用市场嘛?以前刚入门时候也是傻乎乎的这么想的.如果现在你老板提出这样需求场景: ...

  7. Android多渠道打包方案

    1.为什么需要多渠道包 为了区分同一app不同android市场,也就是说不同的市场(比如小米市场.华为市场.应用宝等)使用不同的渠道包,所用代码一致,只是渠道号 channel 不一样,这样做是为了 ...

  8. 美团多渠道打包原理以及使用

    2019独角兽企业重金招聘Python工程师标准>>> 美团多渠道打包原理以及使用 2016-08-10 14:50 1048人阅读 评论(0) 收藏 举报  分类: Android ...

  9. Android V1、V2签名包和快速集成美团多渠道打包

    今日科技快讯 三天的Google I/O大会2018终于落下帷幕,虽说现在的I/O大会重点已经变成了人工智能,但是Android P的推出还是让很多小伙伴激动不已的.这次Android P被喻为近几年 ...

最新文章

  1. Java常见的面试算法题:实现两个线程交替打印1到100的数
  2. Linux 下的hiredis的简单安装、测试*(转)
  3. 年末裁员事件背后的启示录(1)
  4. bzoj 4832 抵制克苏恩
  5. Matlab画三维曲线入门
  6. 单点登录cas常见问题(四) - ticket有哪些存储方式?
  7. 边缘提取算子检测比较
  8. 会员系统用php框架,代码基地会员中心的PHP签到系统结合thinkphp框架
  9. Django与SQL语言中——NULL与空字符串的区别
  10. 计算机网络——物理层设备
  11. 2019款享域视频_钱都花哪了?单日投放最高2443款,复盘2019年买量最烧钱的100款手游...
  12. JavaScript实现AES算法加密和解密
  13. PHP 实现实时通信一般有两种方式
  14. 在ISA2006以SSL-TO-HTTP方式发布内部的WEB服务器(二)
  15. Lesson 3.5 - Maya Commands: getAttr
  16. 【转】Struts2 验证问题:验证失败一次后就连续验证失败
  17. Python网络编程 —— 线程
  18. 名字打架小游戏 java_闲暇极品MD5 能用名字打架的小游戏
  19. 阿里云云效Maven仓库
  20. 什么是TCP粘包?怎么解决这个问题

热门文章

  1. 字符串(string类)
  2. POJ-1664 放苹果
  3. 解决Wireshark 服务运行于非默认端口问题
  4. 如何修改WINDOWS默认的3389远程端口
  5. h.264的NAL和VCL
  6. python3查找文件中指定字符串_Python3在指定路径下递归定位文件中出现的字符串...
  7. 如何在 Linux 上使用 kill 和 killall 来管理进程
  8. Flask-Login一些使用解释(根据官网和个人查找资料的理解并解释)
  9. HDU1756(判断一个点是否在多边形内)
  10. poj1419(最大独立集)