多渠道打包方法简介
来源:互联网 发布:卓越工具箱淘宝客软件 编辑:程序博客网 时间:2024/06/08 15:50
渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠道,例如:小米市场、360市场、应用宝市场等
我们要在安装包中添加不同的标识,应用在请求网络的时候携带渠道信息,方便后台做运营统计(这就是添加渠道信息的用处)。
实现多渠道打包的原理:
一般来讲,这个渠道的标识会放在AndroidManifest.xml的Application的一个Metadata中。然后就可以在java中通过API获取对应的数据了。
目前常用的多渠道打包工具有三种:1、友盟 2、美团 3、360
一、友盟的多渠道实现步骤
1.按照umeng的要求,manifest文件中需要有
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />
这段配置,value那里就是wandoujia,360之类的渠道名称,但是我们在这里不会去写渠道名,写的是一个占位符,后面gradle编译的时候会动态的替换掉它。
2,在module(一般也就是app)的build.gradle的android{}中添加如下内容:
productFlavors{ wandoujia{ manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } xiaomi{ manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"] } }
productFlavors是android节点的一个自节点。你需要打什么渠道的包,就在这里按umeng的要求用渠道名给UMENG_CHANNEL_VALUE赋值。
3.优化1:上面只是两个渠道,如果有几十个渠道,都这样写,重复的东西太多,观察到每个渠道就是flavor的名称,所以修改如下:
productFlavors{ wandoujia{ //manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } xiaomi{ //manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"] } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] }
3.优化2:上面经过签名打包后生成的apk的名称是有默认命名规则的,如:xxx-xiaomi-release.apk 但是我们想包含版本信息如:xxx-xiaomi-release-1.0.apk,所以最终打包脚本如下:
productFlavors{ wandoujia{ //manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } xiaomi{ //manifestPlaceholders=[UMENG_CHANNEL_VALUE: "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) } } }
//3.0以下可以这样配置,3.0的AS版本会报错 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) } } }
如果是这样配置的话,在3.0会报错。
升级了AS3.0以后,在项目编译的时候发现Gradle中报错了,错误如下:
Error:(60, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=xiaomiRelease, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.<a href="openFile:E:\Studio\MyApplication\CodeBook\build.gradle">Open File</a>
解决方法可以用如下配置:
applicationVariants.all { variant -> //批量修改Apk名字 variant.outputs.all { output -> if (!variant.buildType.isDebuggable()) { //获取签名的名字 variant.signingConfig.name //要被替换的源字符串// def sourceFile = "-${variant.flavorName}-${variant.buildType.name}" def sourceFile = ".apk" //替换的字符串 //输出apk名称为:渠道名_版本名_时间.apk// def replaceFile = "${variant.productFlavors[0].name}_V${variant.versionName}_${variant.flavorName}_${variant.buildType.name}" def replaceFile = "-${variant.versionName}_${releaseTime().apk" outputFileName = output.outputFile.name.replace(sourceFile, replaceFile) } } }//获取日期def releaseTime() { return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))}
如果报错误如下:
解决方法是:在主app的build.gradle里面的
defaultConfig {
targetSdkVersion:*
minSdkVersion :*
versionCode:*
versionName :*
//版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了
flavorDimensions “versionCode”
}
4.获取渠道
在代码中我们可以通过读取mate-data信息来获取渠道,然后添加到请求参数中,获取方法如下:
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 "";}
5.执行签名打包:
这时候你去app/build/outputs/apk中就能看到自动打好的渠道包了。
- 多渠道打包方法简介
- 多渠道打包的方法
- Android Studio多渠道打包方法
- android 多渠道打包的概念及方法
- Studio多渠道打包,超简单方法
- Android多渠道打包以及发布方法
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- 多渠道打包
- Gearman的Worker的多进程实现
- 11.27第17节课
- 内嵌式tomcat启动web工程
- JDK7与JDK8中HashMap的实现
- Spring参数校验
- 多渠道打包方法简介
- 处理Gradle中的这个文件下载慢的问题
- 4用于cifar10的卷积神经网络-4.20relu, relu6和softplus激活函数的输出汇总分析
- 1. Hello Go(Go Tutorial)
- JNI错误之:error: base operand of '->' has non-pointer type '_JNIEnv'
- table 和 pivot_table
- 浅析大端小端
- 【Scikit-Learn 中文文档】十九:高斯混合模型
- qml:c++与qml同时需要实现国际化