Android渠道打包

为什么需要渠道打包

  • 为了统计各市场的效果(活跃数、下单数等),需要用某种方式唯一标识它们。
  • 客户端访问API时会在请求参数中带上渠道号,以便后台接下来计算不同渠道的效果。

添加渠道方法

AndroidManifest.xml中的application标签下添加:

1
2
3
4
<!-- UMENG配置 -->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>

build.gradle文件中的android标签下添加:

1
2
3
4
5
6
7
8
9
10
11
productFlavors {
xiaomi {}
qihu360 {}
baidu {}
wandoujia {}
// ...
}

productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}

获取渠道方法

在java代码中获取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 调用方式
Utoast.show(this, "渠道:" + getApplicationMetaValue(this, "UMENG_CHANNEL"));

public static String getApplicationMetaValue(Context context, String name) {
String value = "";
try {
ApplicationInfo appInfo = context.getPackageManager()
.getApplicationInfo(context.getPackageName(),
PackageManager.GET_META_DATA);
value = appInfo.metaData.getString(name);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return value;
}

扩展(更快速的打包方式):

渠道打包的另一种解决方案:使用python脚本在META-INFO中添加channel_<渠道名>名称的空文件;

友盟提供的设置渠道方案

  1. 就是上面的通过AndroidManifest配置

    1
    <meta-data android:name="UMENG_CHANNEL" android:value="UMeng" />
  2. 通过在代码中执行

    1
    2
    String channel = getApplicationMetaValue(this, "UMENG_CHANNEL");
    AnalyticsConfig.setChannel(channel);

NOTE1: 坑,不能同时设置两种方式,友盟技术的解释是优先使用第一次取到了渠道名;如果采用java代码的方式,需要在Application中设置,而不是Activity

NOTE2: 也可以通过url将渠道名传递给后台,由后台来做统计;

参考资料

从keystore中获取md5

1
keytool.exe -v -list -keystore lyloou.jks