<commit_before>---
layout: post
title: "多渠道打包的进化史"
category: Android
tags: [Android, 打包, 多渠道]
date: 2017-11-21 20:47:22
image:
  feature: 32.jpg
  path: /images/32.png
---

Android开发比iOS麻烦的地方在于，应用市场和发布渠道众多。

为了统计和区分各个渠道包的效果和数据，就需要有一种方法来标识它们。

### 石器时代

为了区分不同的渠道包，最直观也是最原始的方案，

就是使用一个变量来表示渠道名，

在Release时，每修改一次变量打一次包，

最后就能在代码中读取这个变量的值，判断属于哪个渠道了。

.

在这其中，以「友盟+ProductFlavors」的方案最具有代表性：

友盟需要在Manifest中使用meta-data标签定义一个UMENG_CHANNEL表示渠道，

而这种方案，则将UMENG_CHANNEL的值使用占位符代替，

在build.gradle中定义不同的ProductFlavors，

然后利用Gradle脚本在打包时动态替换AndroidManifest中占位符的值实现的

```xml
<application
    android:name=".base.App"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name">

    <!-- 友盟统计SDK组件 --><commit_msg>update post<commit_after>---
layout: post
title: "多渠道打包的进化史"
category: Android
tags: [Android, 打包, 多渠道]
date: 2017-11-21 20:47:22
image:
  feature: 32.jpg
  path: /images/32.png
---

Android开发比iOS麻烦的地方在于，应用市场和发布渠道众多。

为了统计和区分各个渠道包的效果和数据，就需要有一种方法来标识它们。

### 石器时代

为了区分不同的渠道包，最直观也是最原始的方案，

就是使用一个变量来表示渠道名，

在Release时，每修改一次变量打一次包，

最后就能在代码中读取这个变量的值，判断属于哪个渠道了。

.

在这其中，以「友盟+ProductFlavors」的方案最具有代表性：

友盟需要在Manifest中使用meta-data标签定义一个UMENG_CHANNEL表示渠道，

而这种方案，则将UMENG_CHANNEL的值使用占位符代替，

在build.gradle中定义不同的ProductFlavors，

然后利用Gradle脚本在打包时动态替换AndroidManifest中占位符的值

```xml
<application
    android:name=".base.App"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name">

    <!-- 友盟统计SDK组件 -->
{'fraction_non_alphanumeric': 0.12210526315789473, 'fraction_numerical': 0.02526315789473684, 'mean_word_length': 6.13, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2190180', 'n_tokens_mistral': 927, 'n_tokens_neox': 968, 'n_words': 75}