Android多渠道打包

Android多渠道打包
概述

每当发新版本时,Android客户端会被分发到各个应用市场,比如豌豆荚,360手机助手等。为了统计这些市场的效果(活跃数,下单数等),需要有一种方法来唯一标识它们。客户端通过渠道号来区分不同的市场,比如,豌豆荚市场中美团应用的渠道号是wandoujia,360手机助手中美团应用的渠道号为qihu360。客户端访问API时会在请求参数中带上渠道号,以便后台接下来计算不同渠道的效果。
如果渠道越来越多的话,手动打包就显得效率太低了,多渠道打包这种高效率打包的方式就显得尤为重要了。
多渠道打包看着挺高大上的,但是其本质就是在APP中动态改变渠道这个参数,就这么简单~
下面我来介绍几种比较常用的多渠道打包方式。

(一)动态资源配置的方式实现多渠道打包
  • 在main的同级目录下,有几个渠道就新建几个渠道的文件夹,文件夹下分别新建一个assets目录,并把每个渠道对应的asserts目录下放置不用的渠道资源配置文件(LeSportsConfig.json
    A4D6461C-E16E-4EDB-95D2-9FDEDD5099E6.png

    目前我们有LETV,TCL,WASU三个渠道,并在每个渠道中放置了不同的配置文件
    注意:main文件夹下的asserts目录就不用放置LeSportsConfig.json文件
  • 在build.gradle中添加productFlavors中添加三个渠道
    如下图所示:


    FCB930A5-4EFA-4604-A266-36419A730201.png

    LeSportsConfig.json

  • 使用gradle命令进行打包

(1) ./gradlew -v 版本号
(2) ./gradlew clean 清除/app目录下的build文件夹
(3)./gradlew build 检查依赖并编译并把debug和release环境的包都打出来
(4) ./gradlew assembleDebug 编译并打Debug包
(5) ./gradlew assembleRelease 编译并打Release的包
(6) ./gradlew installRelease Release模式打包并安装
(7)./gradlew uninstallRelease 卸载Release模式包

  • 当渠道打包完成后,不同的渠道包会读取不同的资源文件
    7E17C076-BE2D-4E81-8909-4DA4B199A63D.png

    这种打包的方式比较简单,缺点也很明显,渠道号少的话还比较好,但是渠道号一多的话,就显得太乏力了,如果有500个渠道的话,你要新建500个对应的不同资源文件。

(二) 在Mainifest.xml配置文件中添加meta-data参数来实现

  • 先在Mainfest.xml中添加名称为PUB_CHANNEL字段,value值为(${PUB_CHANNEL_VALUE}的meta-data属性。

<meta-data android:name="PUB_CHANNEL"android:value="${PUB_CHANNEL_VALUE}" />

  • 在build.gradle文件中配置多个渠道号,并写好每个渠道的实际值
ED0D0405-6119-48E6-A166-7E40530FDCC1.png
  • 在app中获取这个渠道号的值,代码如下:
PackageManager.GET_META_DATA);   
Stringmsg=info.metaData.getString("PUB_CHANNEL");   System.out.println("PUB_CHANNEL:"+msg);

这种打包方式和第一种方式一样效率太低,由于需要配置多个渠道参数,如果渠道包太多,配置的参数比较多不说,还需要打包多次,自然比较耗时~ 该打包方式适合渠道较少的应用

(三) 使用apktool进行多渠道打包

根据第二种打包方式可知,我们可以在Mainifest文件中配置MATE-DATA属性,然后在应用内部获取该参数的方式实现渠道号的配置。那么如果我们通过改变这个参数,也是可以实现多渠道打包的?使用apktool进行打包的方式就出现了~
该打包方式的具体思路如下:

  • 先事先准备一个未打包的apk,使用apktool命令对其进行解压
  • 对于AndroidManifest.xml文件中定义的<meta-data>属性,使用python脚本或者java代码,对渠道的value值进行修改。
  • 修改完毕后,再重新签名打包

上面就是使用apktool打包的方法,通过使用脚本可以批量地生成渠道包。该方法只需构建一次,大大节省了时间。但是没有第四种方式快~(900百个渠道包需要3个小时)
具体参考:
使用apktool进行多渠道打包地址
美团多渠道打包

(4)美团渠道打包方式

实现原理:先打好一个已经签名的apk包,在apk文件中META-INF目录,通过Python脚本在该文件夹下新建一个带有渠道参数的空文件,最后通过在应用内部获取该渠道号。这样只需要打包一次就可以实现多渠道打包了,效率非常高~

  • 下载安装python环境 Python下载地址
  • 下载python脚本 AndroidMultiChannelBuildTool
  • 将ChannelUtil.java代码集成到工程里面,在app启动时获取渠道号传送给后台(如友盟:AnalyticsConfig.setChannel(ChannelUtil.getChannel(this));
  • 下载开源项目AndroidMultiChannelBuildTool
    项目结构如下:
    32A98D56-73B3-46A8-90D3-76475FE51372.png
  • 先打包一个apk文件,然后放在PythonTool文件夹下
  • 在channel.txt文件夹中把所有的渠道号分行添加进去
  • 执行MultiChannelBuildTool.py脚本,之后所有的渠道包就生成了,并会保存在xxx_build/文件夹下。
  • 最后通过ChannelUtil在应用内部获取渠道号即完成整个打包流程了。
    这种方式打多个的时候不需要构建多次,也不需要新建多个资源文件,只需要对apk文件进行解压并新建一个文件夹即可实现多渠道打包~
(5) 自制多参数配置渠道打包

由于项目具有多个渠道包参数需要配置,而不局限于一个渠道名称参数,美团渠道打包的方式是通过python脚本在META-INF目录下
新建一个带有渠道号的空文件夹实现的,那么能不能我们把事先准备好的渠道参数配置文件LeSportsConfig.json复制到META-INF目录下呢?每个渠道包下面都有一份对应的渠道参数配置,然后当应用启动的时候,再去读取里面的参数配置。通过一天的努力终于实现了。


81C50D82-0221-4D2D-9121-EA7507AF946D.png
  • 在美团渠道打包的基础上,我新建了一个config文件夹,里面备份了每个渠道对应的渠道参数配置文件(LeSportsConfig.json)
  • channel.txt文件中依然保持着对应的渠道号
  • 新的python脚本是multi-channel-build-tool.py
    具体流程如下:
  • 首先遍历channel.txt文件中的渠道号,会在config文件夹下寻找对应的渠道参数配置文件(LeSportsConfig.json)
  • 然后脚本回去寻找已经打包好的APK,并新建一个output xxx/
    的文件夹,这个文件夹用来放最终打好的渠道包的。
  • 接着脚本会把已经找到的LeSportsConfig.json文件复制到META-INF文件夹下。
    这样所有的渠道包就这样打好了,
    下面来看看效果,但是执行脚本有点麻烦:
  • 打开终端并进入到PythonTool目录下
  • 执行命令:
    python /Users/liuyu/Deskto/demo/AndroidMultiChannelBuildTool/PythonTool/multi-channel-lesports-build-tool.py
D08342E8-6B68-484A-8A6C-0A94FCFF3478.png

参考网址:
(1) 美团多渠道打包
(2) https://github.com/GavinCT/AndroidMultiChannelBuildTool
(3) https://github.com/AlexSmille
(4) http://blog.csdn.net/u013766103/article/details/52454585

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容