Android多渠道打包

作者: 砺雪凝霜 | 来源:发表于2016-10-20 17:28 被阅读680次
    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

    相关文章

      网友评论

        本文标题:Android多渠道打包

        本文链接:https://www.haomeiwen.com/subject/hcjxuttx.html