/**
* 获取application中指定的meta-data 调用方法时key就是UMENG_CHANNEL
* @return 如果没有获取成功(没有对应值,或者异常),则返回值为空
*/
public static String getAppMetaData(Context ctx, String key) {
if (ctx == null || TextUtils.isEmpty(key)) {
return null;
}
String resultData = null;
try {
PackageManager packageManager = ctx.getPackageManager();
if (packageManager != null) {
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
resultData = applicationInfo.metaData.getString(key);
}
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return resultData;
}
渠道信息一般在 AndroidManifest.xml中修改以下值:
"UMENG_CHANNEL" android:value="wandoujia" />
首先你必须在AndroidManifest.xml中的meta-data修改以下的样子:
data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
其中 UMENGCHANNELVALUE中的值就是你在gradle中自定义配置的值。build.gradle文件就利用productFlavors这样写:productFlavorswandoujiamanifestPlaceholders=[UMENGCHANNELVALUE:“wandoujia”]baidumanifestPlaceholders=[UMENGCHANNELVALUE:“baidu”]c360manifestPlaceholders=[UMENGCHANNELVALUE:“c360”]ucmanifestPlaceholders=[UMENGCHANNELVALUE:“uc”]其中[UMENGCHANNELVALUE:“wandoujia”]就是对应 {UMENG_CHANNEL_VALUE}的值。
可以简化
后来发现上面的重复代码太多,就在网上又发现了一个更简洁的写法
productFlavors {
wandoujia {}
baidu {}
c360 {}
uc {}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
其中name的值对相对应各个productFlavors的选项值,这样就达到自动替换渠道值的目的了。
这样生成apk时,选择相应的Flavors来生成指定渠道的包就可以了,而且生成的apk会自动帮你加上相应渠道的后缀,非常方便和直观。大家可以自己反编译验证。
一次生成所有渠道包
在android studio底栏中有个命令行工具Terminal,打开后就CMD可以自动切换到当前项目的目录下。
有的项目下会有graldew.bat这个文件,你就可以输入这个命令:
gradlew assembleRelease
就可以一次性生成所有的渠道包了