android 多渠道打包
原理
在manifest文件中,application标签内部设置不同的metadata标签即可,可以通过java api获取这个matedata内的值
友盟提供的多渠道打包技术
-
按照umeng的要求,在manifest文件中添加如下代码
<meta-data android:name="UMENG_CHANNEL" android:value="你自己申请的key" />
-
如果在value的地方写死了一个值,会使得每次打包只能固定一个渠道,所以更改为如下方式
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />
使用占位符,在build.gradle的android标签内添加如下代码,区分渠道信息。这个占位符和spring框架中的ognl表达式作用有点像
productFlavors{ huawei{ manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"] } xiaomi{ manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"] } }
可以简写为以下内容
productFlavors{ huawei{ } xiaomi{ } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] }
如果要包含版本信息,可以修改为如下配置
productFlavors{ huawei{ } xiaomi{ } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) { def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk") output.outputFile = new File(outputFile.parent, fileName) } } }
只有是在代码中获取渠道信息,方便发送到服务器进行数据统计
private String getChannel() { try { PackageManager pm = getPackageManager(); ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); return appInfo.metaData.getString("UMENG_CHANNEL"); } catch (PackageManager.NameNotFoundException ignored) { } return ""; }
附加小知识
当电脑连接了多个android设备的时候,使用adb shell时进入不同的设备,可以添加参数
adb -s 序列号 install/shell 等命令
查看序列好
adb devices
显示结果的第一列就是序列号