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文件中配置多个渠道号,并写好每个渠道的实际值
- 在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
参考网址:
(1) 美团多渠道打包
(2) https://github.com/GavinCT/AndroidMultiChannelBuildTool
(3) https://github.com/AlexSmille
(4) http://blog.csdn.net/u013766103/article/details/52454585