一、在AndroidManifest.xml中设置
<meta-data
android:name="UMENG_APPKEY"
android:value="xxxxxxxxxxxxxxxxxxx" /><!--友盟 Appkey 自己应用注册申请来的-->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" /> <!--渠道号,多渠道这里使用了占位符$-->
二、build.gradle(app目录下)
1.在defaultConfig节点下添加默认渠道号
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "default_channel"]//添加一个默认渠道号
2.和defaultConfig同节点添加一个productFlavors节点,内容如下:
//添加渠道号
productFlavors {
tencent{}
_360{}
baidu{}
huawei{}
xiaomi{}
wandoujia{}
// oppo {}
// vivo {}
}
productFlavors 支持多渠道打包,使用它的话,可以为下面每一个市场打包一个apk,里面也是用了manifestPlaceholders 使用相关的值替换了UMENG_CHANNEL_VALUE 。
3.和defaultConfig同节点添加如下内容:
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
会遍历productFlavors下面所有的名称替换UMENG_CHANNEL_VALUE ;
4.最后使用gradlew assembleRelease 打生产包 ;gradlew assembleDebug 打测试包
附加:android获取app当前的渠道号或者获取application中的任意meta-data(以友盟的多渠道打包为例)
/**
* 获取app当前的渠道号或application中指定的meta-data
*
* @return 如果没有获取成功(没有对应值,或者异常),则返回值为空
*/
public static String getAppMetaData(Context context, String key) {
if (context == null || TextUtils.isEmpty(key)) {
return null;
}
String channelNumber = null;
try {
PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
channelNumber = applicationInfo.metaData.getString(key);
}
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return channelNumber;
}
例如在需要的地方获取umeng渠道名(清单文件注册的umeng见文章开头处)
String channelNumber = getAppMetaData(getBaseContext(), "UMENG_CHANNEL");//获取app当前的渠道号
附加:友盟多渠道打包结合android studio3.0+自定义apk名
applicationVariants.all { variant ->
variant.outputs.all { output ->
def fileName = "appindata${variant.versionName}_${variant.productFlavors[0].name}_release_${releaseTime()}.apk"
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith('.apk')) {
outputFileName = fileName // output.outputFile 改为 outputFileName
}
}
}
def releaseTime() {
return new Date().format("yyyy.MM.dd", TimeZone.getTimeZone("UTC"))
}