如何利用Gradle机制多渠道打包

作者: 沉思的Panda | 来源:发表于2016-08-25 16:32 被阅读215次

    Android的应用市场很多,简单罗列就有 360、应用宝、小米、百度、安卓、91、搜狗、华为、豌豆荚、机锋 等等,为了区分不同市场的推广效果,一般产品经理会要求在不同的市场上上架的apk有一个唯一的标志,这个标志被称为渠道号,一般结合友盟统计一起用,可以在友盟后台上看不同渠道的推广效果。

    那怎么样快速地打出多个渠道包呢?
      在Eclipse+ADT时代,最佳方案是美团研发团队研究出来的,利用空文件不影响应用签名验证的原理,可以1分钟内打完900多个渠道的包。
    操作步骤如下:

    1. 编译出一个原始的不带渠道的apk
    2. 利用脚本在apk中添加空的渠道文件,渠道名的前缀为mtchannel_:
    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)
    
    1. 在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 "";
        }
    }
    

    现在步入了Android Studio+Gradle的时代,我们也可以利用Gradle的productFlavors机制来做多渠道打包。以友盟为例,操作步骤如下:

    1. 在 AndroidManifest.xml中修改UMENG_CHANNEL
    <meta-data android:name="UMENG_CHANNEL" 
    android:value="${UMENG_CHANNEL_VALUE}" />
    
    1. 在模块下的build.gradle文件中增加
    android{
        productFlavors {
          yingyongbao{}
          baidu{}
          anzhuo{}
          jiuyi91{}
          sanliuling360{}
          sougou{}
          huawei{}
          xiaomik{}
          wandoujia{}
          jifeng{}
          productFlavors.all { flavor ->
              flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
          }
        }
    }
    
    1. 在项目文件夹下执行命令gradlew assembleRelease
    2. 最后在build/outputs/apk下面就能看到生成的包了。

    这种方式,简单方便不用写脚本,但是耗时比较长,10个渠道打包要3~4分钟,从时效上来看,还是美团提供的方法比较好。

    打完包之后,要验证一下,同样以友盟统计为例,怎么样知道自己的渠道号有没有修改成功呢?

    1. 把设备在友盟后台注册为测试设备
    2. 在代码中打开调试开关
    MobclickAgent.setDebugMode( true );
    
    1. 点击不同页面,在logcat中查看MobclickAgent标签的信息,看到信息上传后,去友盟后台统计到的渠道是否符合预期。

    参考:

    1. 美团Android自动化之旅—生成渠道包
    2. [Android Studio] Android studio 多渠道打包(超简洁版)

    Panda
    2016-08-25

    相关文章

      网友评论

      • 陆地蛟龙:我们的情况特殊,每次一个版本出去 有差异的渠道比较多,还不是每次固定。所以只能手动打了。
      • 陆地蛟龙:我能理解为 这种打包 只是单纯的针对为 改渠道名称呢?
        对于每个渠道的SDK 部分功能做调整 这种情况有什么好的方式吗?
        沉思的Panda:@胡髭蛤蟆 根据渠道号,做功能控制
      • Tang1024:正好需要,如果能更详细点就完美了:smile::yum:
        沉思的Panda:@撒旦之恋歌 哪些地方不清楚呢?我来加上

      本文标题:如何利用Gradle机制多渠道打包

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