Apk 多渠道打包

多渠道打包的用途(为什么要进行多渠道打包)

通过多渠道打包,将对应的 APP 发布到对应的应用渠道市场上
再利用友盟统计,来统计不同渠道上的 APP 下载量、安装量等数据信息
下载量:用户下载一次,下载量记为1次
安装量:同一个手机安装多次(不论从哪个应用市场进行的下载安装),安装量都记为1次

第一步:

在 AndroidManifest.xml 中的 Application 节点下添加如下代码
这里之所以命名 name 为 UMENG_CHANNEL,是因为我们将多渠道导包与友盟统计配合使用

这里写图片描述

<!--多渠道打包 - 友盟统计-->
<meta-data
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}" />

第二步:

在 module 的 build.gradle 中的 android 节点下添加如下代码

这里写图片描述

//多渠道打包 - 友盟统计
productFlavors {
    yingyongbao {}
    wandoujia {}
    xiaomi {}
}
productFlavors.all {
    flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}

第三步:

在 module 的 build.gradle 中的 android 节点下的 buildTypes 节点下的 release 版本配置中添加如下代码

这里写图片描述

applicationVariants.all { variant ->
   variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            // 输出apk名称为app_v1.0_xxxx-xx-xx_xxxx.apk
            // def fileName = "app_v${defaultConfig.versionName}_${releaseTime()}.apk"
            // 输出apk名称为app_v1.0.apk
            // def fileName = outputFile.name.replace(".apk", "app_v${defaultConfig.versionName}.apk")
            // 输出apk名称为app_v1.0_yingyongbao.apk
            def fileName = "app_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
            output.outputFile = new File(outputFile.parent, fileName)
        }
    }
}

第四步:

生成 release 的 apk

点击 android studio 工具栏的 Build,选择 Generate Signed APK…,等待生成多渠道包,可能有点慢

这里写图片描述

至此、多渠道打包结束

这里写图片描述

如果用的是 友盟统计,只需按照友盟统计的官方文档进行集成友盟统计即可

除了上述原始的多渠道打包方式外,还有其他的多渠道打包方式,如美团多渠道打包、360多渠道打包等,打包速度极快,15秒钟可打包300左右,当然也是存在缺陷的,个人觉得一共就发布几个主流的应用渠道的话,使用原始的多渠道打包就好,慢不多少,还规避了一些风险

备注:

如果是没用到友盟统计的话,可以在需要的地方,添加如下代码
将 getChannel() 方法获取到的 渠道名 发送到服务器进行相应的统计。

这里写图片描述

/**
 * 获取渠道名称
 * 用于多渠道打包
 *
 * @return
 */
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) {
       ignored.printStackTrace();
   }
   return "";
}

至此、Over

猜你喜欢

转载自blog.csdn.net/qq_34801506/article/details/80596158