Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >美团多渠道打包方案详解,速度快到白驹过隙

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

作者头像
非著名程序员
发布于 2018-02-02 11:37:49
发布于 2018-02-02 11:37:49
1.6K00
代码可运行
举报
文章被收录于专栏:非著名程序员非著名程序员
运行总次数:0
代码可运行

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

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

传统方式

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

  • 方案一:完全的重新编译,即在代码重新编译打包之前,在AndroidManifest中修改渠道标示;
  • 方案二:通过ApkTool进行解包,然后修改AndroidManifest中修改渠道标示,最后再通过ApkTool进行打包、签名。

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

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

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

第一步:解压apk文件

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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代码读取渠道名的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非著名程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
android如何多渠道打包?
关于如何多渠道打包,以下文字详细解答了Android如何实现多渠道打包以及快速打包。
分你一些日落
2021/11/25
1.5K0
第十一章 Android Gradle多渠道构建
因为我们发布或者推广的渠道不同,就造成了我们的Android App可能会有很多个,因为我们需要细分他们,才能针对不同的渠道做不同的处理,比如统计跟踪、是否升级、App名字是否一致等等。尤其在国内这个各种应用市场百家争鸣的时代,我们需要发布的App渠道甚至多个好几百个,而且各有各的特殊处理,所以这就更需要我们有一套自动的满足多渠道构建的工具来帮我们解决这个问题,有了Android Gradle的Flavor后,我们就可以完美的解决以上问题,并且可以实现批量自动化。这一章主要介绍多渠道构建的基本原理,然后使用Flurry和友盟这两个最常用的分析统计平台作为例子来演示多渠道构建,接着我们介绍下Flavor的每个配置的用法,让大家可以根据需求定制自己的每个渠道,最后我们会介绍一种快速打包上百个渠道的方法,以提高多渠道构建的效率。
acc8226
2022/05/17
8950
第十一章 Android Gradle多渠道构建
使用Python多渠道打包apk
使用Python生成多渠道包 往apk包中追加到一个空文件到META-INF目录以标识渠道,Android中获取此文件即可获得App的下载渠道 首先在info文件夹新建一个qdb.txt的空文本
易墨
2018/09/14
2.2K0
使用Python多渠道打包apk
用Java实现Android多渠道打包工具
0001b ====== 最近在公司做了一个多渠道打包的工具,趁今天有空就来讲讲 Android 多渠道打包这件小事。众所周知,随着业务的不断增长,APP 的渠道也会越来越多,如果用 Gradle 打多渠道包的话,可能会耗费几个小时的时间才能打出几百个渠道包。所以就必须有一种方法能够解决这种问题。
俞其荣
2022/07/28
9311
用Java实现Android多渠道打包工具
Android自动化构建之Ant多渠道打包实践(下)
前言 上一篇(Android自动化构建之Ant多渠道打包实践(上))已经介绍了Android的apk是如何构建的,本篇博客继续Ant打包的实践过程。 集成友盟统计SDK 这里以友盟统计为例,对各个渠道进行统计,我们需要先集成它的SDK 配置权限 <!-- 权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permis
巫山老妖
2018/07/20
4370
使用Gradle实现多渠道打包
这里我们主要用到gradle文件中的buildTypes和productFlavors,今天我们主要研究下它俩。
蜻蜓队长
2018/08/03
5180
使用Gradle实现多渠道打包
Gradle多渠道打包
国内Android应用市场品种太多,血统不纯,每次上线App都打包打到手软,上传上到吐血!好在我们有了Android studio和gradle,一条命令打包各种渠道版本App!
GitOPEN
2019/03/01
1.1K0
Android项目实战(三十五):多渠道打包
多渠道打包:   可以理解为:同时发布多个渠道的apk。分别上架不同的应用商店。这些apk带有各自渠道的标签,用于统计分析各个商店的下载次数等数据。   实现步骤 一、添加友盟渠道标签     添加位置:app目录下的 AndroidManifest.xml文件      添加语句:     <!--多渠道打包--> <meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>     示
听着music睡
2018/05/18
1K0
Android Studio 使用Gradle多渠道打包
我们都知道国内应用市场非常多,为了统计各个应用市场的app下载量和使用情况,我们需要多渠道的打包。如果一个一个的手动去打包岂不烦死了,要多麻烦就有多麻烦。这就要求我们学会使用Gradle进行多渠道打包。废话不多说了,直接进入正题吧! 第一步:配置AndroidManifest.xml 以友盟渠道为例,渠道信息一般都是写在 AndroidManifest.xml文件中,大约如下: <meta-data android:name="UMENG_CHANNEL" android:value="xiaomi" />
非著名程序员
2018/02/02
9450
Android使用Ant进行apk多渠道打包
Android使用Ant进行apk多渠道打包 前言: Ant 是什么? 详细介绍请看http://ant.apache.org/ 总之一句话:Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。 准备工作: android sdk中默认支持使用ant来执行编译动作。但是要想使用ant来进行编译,还需要ant的执行环境。 为了能顺利使用ant来编译,我们需要如下准备: 1,android sdk,最简单的是下载一个adt bundle即可; 2,ant包,下载链接:htt
用户1289394
2018/02/26
9330
AndroidStudio3.0多渠道打包:我用一行命令打出N个包
csdn: http://blog.csdn.net/k_bb_666
蜻蜓队长
2018/08/03
4020
AndroidStudio3.0多渠道打包:我用一行命令打出N个包
Android自动化构建之-Ant多渠道打包(上)
前言 Ant是历史比较悠久的一个自动化构建工具,Android开发者可以通过它来实现自动化构建,也可以实现多渠道打包,关于apk打包的方式一般有Ant、Python、Gradle三种,这三种打包方式都各自有优点和缺点,本篇博文先给大家介绍如何使用Ant来实现自动构建和多渠道发布。 开发环境 Window7 Ant jdk android sdk mac系统下所需要的运行环境也是类似的,我们都需要配置Ant、jdk、sdk的环境变量,我们可以看一下window下是环境变量配了些什么: ANT_HOME : D
巫山老妖
2018/07/20
5600
Android 新一代多渠道打包神器
李涛
2017/04/21
6.5K2
Android 新一代多渠道打包神器
下一代Android渠道打包工具
前面我们曾经讲过两种Android的渠道打包方式,包括其中的原理都有所涉及。今天给大家讲解的是packer-ng-plugin简称packer,号称是下一代的Android渠道打包工具。估计应该有人在使用了,会的同学可以略过今天的这篇推送,去学习其他内容吧,没有使用过的就往下看。 在讲这个号称:下一代Android渠道打包工具之前,我们先来回顾一下原来基础的打包原理和美团的多渠道打包原理。这里我就不过多介绍了,没看过之前文章的,点击下方链接进行复习即可。 Android Studio 使用Gradle多渠道
非著名程序员
2018/02/02
1.6K1
下一代Android渠道打包工具
【Android】Walle多渠道打包&Tinker热修复
Walle 介绍 Walle(瓦力):Android Signature V2 Scheme签名下的新一代渠道包打包神器。 瓦力通过在Apk中的APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,可以作为单机工具来使用,也可以部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。 ——来自 Walle 使用 使用Walle生成多渠道的速度是很快的,原来的项目打一个包就需要两分钟多,每次发布打7个包需要十几分钟。用了Walle后,7个包只要两分钟左右
Gavin-ZYX
2018/05/18
1.4K0
相关推荐
android如何多渠道打包?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验