一.场景
应用需要接入统计服务,了解应用在不同应用市场的表现时,分发到不同应用市场的apk需要一个渠道名区分不同应用市场。这时就需要打多个不同的包,每个包对应一个渠道名, 即对应一个应用市场。
二.多渠道打包实践(以友盟统计为例)
1.Gradle方式
(1)在AndroidManifest.xml清单文件中设置友盟统计的APPKEY和应用推广的渠道名称。
<!--友盟统计APPKEY-->
<meta-data android:name="UMENG_APPKEY" android:value="58cba6" />
<!--应用推广的渠道名称-->
<!--${UMENG_CHANNEL_VALUE}的值就是gradle中自定义配置的UMENG_CHANNEL_VALUE的值-->
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"/>
(2)在项目Module的build.gradle文件的android标签下添加代码,配置多个渠道。
//多渠道配
productFlavors {
//设置百度应用市场渠道名为baidu
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu "]
}
//设置360应用市场渠道名为360
360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
}
//设置wandoujia 应用市场渠道名为wandoujia
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia "]
}
}
(3)签名打包,这时就会生成对应(2)中配置的三个渠道的三个apk文件。
(4)特殊需求:每个渠道包的图标和应用名都不一样。
a.在AndroidManifest.xml清单文件中设置包名和图标时如下
<application
android:icon="${app_icon}"
android:label="${app_name}">
b.步骤(2)中修改以下
productFlavors {
baidu {
//设置百度应用市场渠道下渠道名为baidu
//应用名@string/app_name_baidu
//应用名@string/app_name_baidu
manifestPlaceholders = [app_name: "@string/app_name_baidu",
app_icon: "@string/app_name_baidu",
UMENG_CHANNEL_VALUE: "baidu"]
}
360{
manifestPlaceholders = [app_name: "@string/app_name_360",
app_icon: "@mipmap/no2",
UMENG_CHANNEL_VALUE: "360"]
}
wandoujia{
manifestPlaceholders = [app_name: "@string/app_name_wandoujia",
app_icon: "@mipmap/no3",
UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
2.使用360加固宝
(1)在AndroidManifest.xml清单文件中设置友盟统计的APPKEY和应用推广的渠道名称。
<!--友盟统计APPKEY-->
<meta-data android:name="UMENG_APPKEY" android:value="58cba6c6e88bad3c540008d3" />
<!--设置一个默认的渠道名:service-->
<meta-data android:name="UMENG_CHANNEL" android:value="service"/>
(2)360加固宝的配置信息中进行多渠道配置
如上图添加了三个渠道
选择友盟统计平台对应步骤(1)中设置渠道名中的name:UMENG_CHANNEL
填写渠道编号对应步骤(1)中设置渠道名中的value:wandoujia
(3)使用AndroidStudio打包一个apk,再用360加固宝对apk加固,这时就会产生3个加固后的apk。(都这里别和我说加固宝不会用)
三.获取渠道信息
想要验证渠道包的渠道名是不是相对应,这就需要获取渠道信息进行验证,代码如下。
//key为渠道名的key,对应友盟的 UMENG_CHANNEL
private String getChannel(Context context,String key) {
try {
PackageManager pm = context.getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString(key);
} catch (PackageManager.NameNotFoundException ignored) {
}
return "";
}