博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
美团多渠道打包原理以及使用
阅读量:5975 次
发布时间:2019-06-19

本文共 2046 字,大约阅读时间需要 6 分钟。

hot3.png

2016-08-10 14:50 1048人阅读 (0) 收藏 

category_icon.jpg 分类:

Android(8) arrow_triangle%20_down.jpg

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录

传统打包方法原理

  • 传统的打包方法都是在AndroidManifest添加渠道标示,每打一次包修改一次标示的名称。效率特别的低,一个稍微大一点的项目打上几十个渠道包可能需要几个小时半天的时间。

 

美团打包方法原理

  • 由于传统的打包方式每次修改渠道都需要重新的构建项目,时间都浪费构建上面了,美团提供了一种新的打包方案,将APK直接当做zip解压目录里会有一个META-INF目录而此目录是不参与签名校验的。因此在META-INF目录内添加不同的空文件,可以唯一标识一个渠道。采用这种方式,每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件即可。

 

  • 所以打包可以分成两大步。 第一步在META-INF目录内添加不同的空文件,用于标识渠道。(不会写? 不用担心, 已经有大神给我们写好了。:  下载即可。Python 写的)
  •     

 

  • 第二步: 在我们的代码中获取到META-INF目录中的渠道文件名称

[java]  

 

  1. /** 
  2.  * 从apk中获取版本信息 
  3.  *  context 
  4.  *  channelKey 
  5.  *  
  6.  */  
  7. private static String getChannelFromApk(Context context, String channelKey) {  
  8.     //从apk包中获取  
  9.     ApplicationInfo appinfo = context.getApplicationInfo();  
  10.     String sourceDir = appinfo.sourceDir;  
  11.     //注意这里:默认放在meta-inf/里, 所以需要再拼接一下  
  12.     String key = "META-INF/" + channelKey;  
  13.     String ret = "";  
  14.     ZipFile zipfile = null;  
  15.     try {  
  16.         zipfile = new ZipFile(sourceDir);  
  17.         Enumeration<?> entries = zipfile.entries();  
  18.         while (entries.hasMoreElements()) {  
  19.             ZipEntry entry = ((ZipEntry) entries.nextElement());  
  20.             String entryName = entry.getName();  
  21.             if (entryName.startsWith(key)) {  
  22.                 ret = entryName;  
  23.                 break;  
  24.             }  
  25.         }  
  26.     } catch (IOException e) {  
  27.         e.printStackTrace();  
  28.     } finally {  
  29.         if (zipfile != null) {  
  30.             try {  
  31.                 zipfile.close();  
  32.             } catch (IOException e) {  
  33.                 e.printStackTrace();  
  34.             }  
  35.         }  
  36.     }  
  37.     String[] split = ret.split("_");  
  38.     String channel = "";  
  39.     if (split != null && split.length >= 2) {  
  40.         channel = ret.substring(split[0].length() + 1);  
  41.     }  
  42.     return channel;  
  43. }  

 

实践使用:

  • 第一步:配置python环境:

                我们既然需要使用脚本打包,那么相应的电脑上必须有可以运行python脚本的运行环境。所以我们第一步是要配置python运行环境。

                自己去官网下载安装即可,非常简单。官网地址:https://www.python.org/

 

  • 第二步:编写python脚本:

                好心人已经把运行的打包脚本写好了,并且也封装了读取渠道号的实体工具类。大家只需要去github上下载即可。

                地址:当然在github上也有相关的使用介绍,非常简单,一看就懂。这里简单说下,

                下载下来有个ChannelUtil.java类,里面封装好了获取渠道号的方法,只需要在启动应用程序的地方调用友盟的设置代码即可,

                比如:AnalyticsConfig.setChannel(ChannelUtil.getChannel(this))。

  • 第三步:配置渠道列表

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

 

  • 第四步:运行脚本

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

                即可完成打包。

转载于:https://my.oschina.net/u/3318187/blog/855675

你可能感兴趣的文章
Linux 内核已支持苹果
查看>>
shell脚本逻辑判断,文件目录属性判断,if,case用法
查看>>
【二叉树系列】二叉树课程大作业
查看>>
App重新启动
查看>>
矩阵乘法
查看>>
得到目标元素距离视口的距离以及元素自身的宽度与高度(用于浮层位置的动态改变)...
查看>>
安装和配置Tomcat
查看>>
实验三
查看>>
openssh for windows
查看>>
PostgreSQL cheatSheet
查看>>
ASP.NET Core 2 学习笔记(三)中间件
查看>>
转:Mosquitto用户认证配置
查看>>
SpringBoot上传文件到本服务器 目录与jar包同级
查看>>
python开发_difflib字符串比较
查看>>
被解放的姜戈01 初试天涯
查看>>
三极管工作区在Spectre中的表示
查看>>
HT for Web的HTML5树组件延迟加载技术实现
查看>>
ASP.NET MVC 3 Razor Nested foreach with if statements
查看>>
【Mysql】命令行
查看>>
Asterisk 安装与配置
查看>>