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

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

如何利用Gradle机制多渠道打包_第1张图片

那怎么样快速地打出多个渠道包呢?
  在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

  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标签的信息,看到信息上传后,去友盟后台统计到的渠道是否符合预期。
    如何利用Gradle机制多渠道打包_第2张图片

参考:

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

Panda
2016-08-25

你可能感兴趣的:(如何利用Gradle机制多渠道打包)