热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android多渠道(友盟)打包教程分享

这篇文章主要介绍了Android多渠道(友盟)打包教程分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我们在 app 正式发布的时候一定会使用正式签名的方式来打包,这种方式只能生成唯一的一个包,但是如今的应用商店非常多,如:小米、OPPO、360、百度、豌豆荚、应用宝等等。而我们只有一个 apk 文件要投入到这么多的应用商店中去,如果你的公司不需要统计每个应用商店的实际下载使用量的话,那倒是不会有这样的问题。

但是,如果你的公司就是需要统计每个商店的实际下载使用情况,那么你将如何去识别当前用户是从哪一个商店下载来的呢?出现问题原因是:我们使用的 apk 安装包当前仅有一个。

假设,我们可以向 apk 内植入一个字符串,比如我给发布到小米商店的 apk 中植入“xiaomi” ,然后拷贝一份 apk 安装包发布到小米商店中,给百度植入“baidu”,然后也拷贝一份发布到百度商店中,然后通过 JAVA 代码在用户从某一个商店中下载并使用时,我获取这个字符串,然后返回给后台,这不就可以知道用户从哪个商店下载了吗!

多渠道就是指我们的应用程序可以从不同的商店下载,不同的应用商店就是不同的渠道。那你可能会有疑惑,我们为什么要知道用户从哪个渠道下载的呢?

这个问题其实与利益息息相关,你这样想。假如你写一个 app 发布到不同的商店上,你肯定会关注究竟哪一个商店的用户使用量比较多、下载量比较大的问题,你可能手头没有那么多经济去每一个商店平台都推广你的 app ,所以你要记录哪个商店用户量最大,然后着重推广。

友盟打包

说了这么多,相信你已经明白多渠道打包的重要性了。既然我们可以向每一个 apk 中植入一个标志这商店名称的字符串,那么如果一个一个的来的话,显然是一个庞大的工作,没有多大实际意义,而且 apk 文件是无法直接向里面添加一个外部文件的,你需要其他的手段来实现,那么我们先来看友盟多渠道打包的方式。

友盟的实现方式是通过 xxx.keystore 文件来进行一个一个的压包,通过代码的方式来分别生成一个你指定的应用商店的对应 apk 文件。这种方式会比较慢,如果你的需求是要投入到几百上千个商店的话,显然生成文件的速度会非常慢。但如果你的需求量在几十上百,我建议你可以使用友盟来打包,公司也通常使用这种方式。

那么我们看看如何实现吧!

一、引入友盟支持

在工程列表(AndroidManifest.xml)文件中加入友盟提供的支持,这个与 Activity 并列层级。


二、添加闭包

然后在 app 的 build.gradle 中添加以下代码,目的是为了生成对应的应用商店的 apk ,添加位置在 android 闭包下,以下代码不难理解。

注意:在 gradle 中是无法使用数字开头的名字,所以你应该懂得变更一下。

 //友盟闭包
 productFlavors {
 wandoujia {}
 xiaomi {}
 baidu {}
 yingyongbao {}
 //注意 360:gradle 中不能以数字开头
 _360{}
 }
 productFlavors.all { flavor ->
 flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
 }

这里注意一下,也许你会报这个错误:

ERROR: All flavors must now belong to a named flavor dimension.

解决方法就是在上面的 defalutConfig 闭包中添加内容:

flavorDimensions "versionCode"

然后再同步一下就没有问题了。

三、签名打包

接下来就是打包的过程了,很简单,我们只需要选中如下图中的各个应用商店的版本即可,然后它就会在你设定的目录下生成对应的 apk 文件了。

如果对签名打包不懂的可以看这篇文章:Android App正式签名打包流程

这就是我的项目生成的对应的 apk 文件所在的文件夹,点进去就会看到安装包啦。

四、添加版本号

当然了,你可能希望加入当前 app 的开发版本号,这样就对每个版本升级时所用的 apk 包就一目了然了。这是你需要把当前 app build.gradle 中的 deflautConfig闭包下的 versionName 给设置到打包生成的 apk 名中。那代码是这样的:

 //为多渠道包添加 app 版本号
 applicationVariants.all { variant ->
 variant.outputs.all { output ->
  def outputFile = output.outputFile
  if (outputFile != null && outputFile.name.endsWith(".apk")) {
  def fileName = outputFile.name.replace(".apk", "-${ defaultConfig.versionName }.apk")
  outputFileName = fileName;
  }
 }
 }

这是一段 groovy 语言,通常在 jvm 中使用,可以很好的和 java 代码配合。你只需要将它添加到刚刚写的友盟闭包后面就可以了,如这样:

然后你再一次打包一下,就可以在目录中看到 apk 文件了,一个是刚刚没有添加的默认版本,一个是拥有版本号。

注意:这里会有一个警告信息,内容是这样:

WARNING: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.It will be removed at the end of 2019.

它是说这个 API 在 2019 年末将要被替换成后面的一个,不过别担心,只要你在升级 gradle 的时候注意一下就好了,在未来它要被替换的时候,你也要做出相应的更改!

五、获取渠道信息

到目前为止,我们还没真正的看到这样打包有什么用处。不着急,我们需要将每个 apk 文件发布到对应的商店以后才需要获取这个字符串,这样才能够真正的识别用户在哪个商店中下载来的,然后在用户使用量最大的商店中去大力推广。那么如何获取这个字符串呢?

我就简单一点,在 MainActivity 中直接获取这个字符串了,在实际开发中,显然是要把这个信息传给后台进行统计的,不然没有任何意义。我们的获取代码如下:

还记得我们在 meta-data 中定义了 UMENG_CHANNEL 属性的名字吗,现在我们就可以利用它来获取 字符串 了。

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
 
public class ChannelUtil {
 public static String getChannel(Context context) {
 PackageManager pm = context.getPackageManager();
 ApplicationInfo appInfo = null;
 try {
  appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
  return appInfo.metaData.getString("UMENG_CHANNEL");
 } catch (PackageManager.NameNotFoundException e) {
  e.printStackTrace();
 }
 return "";
 }
}

然后我在启动 app 的时候使用 toast 验证一下是否如我们想象的一样:


获取渠道信息

结果没错,相信大家已经明白了多渠道打包的作用了,它的本质就是在签名打包的时候嵌入一个字符串,通过不同的 apk 包对应不同的商店名,然后上传到相应的商店,最后获取这个字符串值返回给后台。那么,本篇关于多渠道打包的内容就这样讲完了。

以上这篇Android 多渠道(友盟)打包教程分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 在Notepad++中配置Markdown语法高亮及实时预览功能
    本文详细介绍了如何在Notepad++中配置Markdown语法高亮和实时预览功能,包括必要的插件安装和设置步骤。 ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 本文介绍了Tomcat的基本操作,包括启动、关闭及首次访问的方法,并详细讲解了如何在IDEA中创建Web项目,配置Servlet及其映射,以及如何将项目部署到Tomcat。 ... [详细]
  • 本文介绍了如何使用微信小程序的.wxml、.wxss和.js文件来实现点击获取数据及侧边栏显示功能。具体包括页面布局、样式设置以及事件处理。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 探索Java 11中的ZGC垃圾收集器
    Java 11引入了一种新的垃圾收集器——ZGC,由Oracle公司研发,旨在支持TB级别的内存容量,并保证极低的暂停时间。本文将探讨ZGC的开发背景、技术特点及其潜在的应用前景。 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 本文探讨了使用普通生成函数和指数生成函数解决组合与排列问题的方法,特别是在处理特定路径计数问题时的应用。文章通过详细分析和代码实现,展示了如何高效地计算在给定条件下不相邻相同元素的排列数量。 ... [详细]
  • Pacing设置在性能测试中扮演着至关重要的角色,它直接影响到模拟用户行为的真实性和测试结果的准确性。本文将探讨Pacing设置的不同方法及其应用场景,帮助测试人员更好地理解和利用这一功能。 ... [详细]
  • 本文提供了一种有效的方法来解决当Android Studio因电脑意外重启而导致的所有import语句出现错误的问题。通过清除缓存和重建项目结构,可以快速恢复开发环境。 ... [详细]
author-avatar
许仙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有