热门标签 | 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 中是无法使用数字开头的名字,所以你应该懂得变更一下。

1
2
3
4
5
6
7
8
9
10
11
12
//友盟闭包
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 名中。那代码是这样的:

1
2
3
4
5
6
7
8
9
10
//为多渠道包添加 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 属性的名字吗,现在我们就可以利用它来获取 字符串 了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 多渠道(友盟)打包教程分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 百度搜索结果链接提取工具 UrlGetter V1.43
    该工具专为获取百度搜索引擎的结果页面中的网址链接而设计,能够解析并转换为原始URL。通过正则表达式匹配技术,精准提取网页链接,并提供详细的使用说明和下载资源。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
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社区 版权所有