Andorid渠道市场有多分散呢?分散到比Android碎片化还严重,你还在为多渠道打包而头疼吗?美团提供了速度快到白驹过隙的多渠道打包方案。说的有点夸张,对,虽然夸张,可是确实很快,不夸张不足以形容其快。废话很少说,先讲原理,再讲实践方法。html
在AndroidManifest定义渠道的年代,多渠道打包无非如下两种方案:java
方案一:彻底的从新编译,即在代码从新编译打包以前,在AndroidManifest中修改渠道标示;python
方案二:经过ApkTool进行解包,而后修改AndroidManifest中修改渠道标示,最后再经过ApkTool进行打包、签名。android
这两种打包方式,不论是哪一种,效率都很低,方案一毫无效率可言,并且打包的渠道规模很是小,第二种方案效率稍微高些,打包的渠道规模也还能够,可是这两种方案速度慢的惊人,若是你打个上百的渠道包试试,估计你的电脑能卡一下午。慢,固然也有好处,你能够不用工做了,喝着咖啡,玩着手机慢慢等也很惬意是不?哈哈……git
美团高效的多渠道打包方案是把一个Android应用程序包看成一个zip文件包进行解压,而后发如今签名生成的目录下添加一个空文件,空文件用渠道名来命名,并且不须要从新签名。这种方式不须要从新签名,编译等步骤,使得这种方法很是高效。程序员
咱们直接解压apk,解压后的根目录会有一个META-INF目录,以下图所示:github
若是在META-INF目录内添加空文件,能够不用从新签名应用。所以,经过为不一样渠道的应用添加不一样的空文件,能够惟一标识一个渠道。微信
咱们用python代码来给apk添加空的渠道文件,渠道名的前缀为mtchannel_:app
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代码读取渠道名的方法:
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运行环境。
本身去官网下载安装便可,很是简单。官网地址:https://www.python.org/
好心人已经把运行的打包脚本写好了,而且也封装了读取渠道号的实体工具类。你们只须要去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,到这里基本就讲完了,讲了讲原理,又讲了讲实践方式,鉴于别人都给你造好轮子了,因此使用起来很是简单,赶忙去试一试吧。若是不明白的能够留言,欢迎一块儿交流。
参考文章:
http://tech.meituan.com/mt-apk-packaging.html
移动开发者的汇集地,公众号“非著名程序员”,天天一篇原创技术分享和移动互联网知识分享,微信公众号:smart_android,头条号和百度百家帐号都是“非著名程序员”。