多渠道打包方法简介

来源:互联网 发布:卓越工具箱淘宝客软件 编辑:程序博客网 时间: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中就能看到自动打好的渠道包了。

原创粉丝点击