一、前言

在 App 开发完成上架的时候,我们可能需要对上架到各个应用商店的 apk 包做一些区分,方便后续一些相关业务的开展。因此我们就需要在 App 打包的时候,给上架到不同应用商店的 Apk 中写入不同的渠道信息。这个时候,我们就需要进行多渠道打包了。多渠道打包也是有许多知识需要进行学习,在这里我们就只针对官方提供的多渠道打包方法做一下简单的介绍。

二、认识 flavorDimension 和 productFlavor

flavorDimension 翻译过来叫做风味维度,productFlavor 则叫做产品风味。它们两者之间的关系紧密相连:每一个产品风味都必须归属于某一个特定的风味维度,而每一个风味维度则至少要有一个产品风味。这里面,风味维度相当于充当了 的角色,而产品风味则是充当了 成员 的角色,每一个成员属于特定的小组,每一个小组则至少要有一个成员。最终打包的时候,就是从不同的小组中抽取成员进行组合,再将各个成员里面包含的信息写到 Apk 里面,得到不同的 Apk 包。这样说可能有点抽象,不太好理解,下面我们会结合具体的代码和最终结果来补充说明。

三、实例演示

我们先创建一个新的工程项目,然后打开 app 模块下的 build.gradle

  • 如果我们只是单纯的想要对不同的应用商店包做区分,那么我们只需要在 flavorDimensions 中添加一个风味维度(比如 channel),然后在 productFlavors 中添加不同的产品风味,代码如下:
android {//省略其他无关代码...flavorDimensions "channel"productFlavors {huawei {// dimension 用于标识该产品风味属于 channel 这个风味维度dimension "channel"}xiaomi {dimension "channel"}}
}

这样,我们就可以打出不同渠道的包了。我们先点击一下同步按钮进行同步,同步完成之后,我们就可以在 Android studio 左侧的 Build Variants中看到,Active Build Variant这一选项,已经由原来的 debugrelease 2项变为如下 4 项:

分别是 huaweiDebughuaweiRelease,以及 xiaomiDebugxiaomiRelease

可能这里就有小伙伴要问了:“不同的渠道包是有了,但是要怎样判断当前是什么渠道包,这样我才能完成有关渠道的业务需求啊?”

这个问题问得好。
我们在完成上面的操作之后呢,是可以打出不同的渠道包了,不过还缺少了一个最重要的环节,就是给不同的产品风味写入不同的配置信息,这样我们才能根据不同的配置信息来判断是哪个渠道的包。我们修改一下 build.gradle中的代码,修改后代码如下:

android {//省略其他无关代码...flavorDimensions "channel"productFlavors {huawei {manifestPlaceholders = [CHANNEL_VALUE: "huawei"]// dimension 用于标识该产品风味属于 channel 这个风味维度dimension "channel"}xiaomi {manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"]dimension "channel"}}
}

可以看到,我们给每一个产品风味都添加了一个 manifestPlaceholders ,里面有一个 key - valuekey 都是 CHANNEL_VALUE,值则分别是 huawei 以及 xiaomi。这样,我们在打不同渠道包的时候,CHANNEL_VALUE 这个 key 所对应的 value 就会被赋予不同的值,下面我们通过代码来验证一下。

我们在 AndroidManifest 中把这个 CHANNEL_VALUE 用起来:

<application//省略其他无关代码...<meta-dataandroid:name="CHANNEL"android:value="${CHANNEL_VALUE}" />
</application>

然后我们修改一下 MainActivity 中的代码,修改后代码如下:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 获取 channel 信息Log.d(TAG, "CHANNEL: ${getAppChannel()}")}private fun getAppChannel(): String? {val metadata =packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA).metaDatareturn metadata.getString("CHANNEL")}companion object {private const val TAG = "MainActivity_Flavor"}
}

我们在 Android studio 左侧的 Build Variants 切换 Active Build VarianthuaweiDebug,然后点击一下运行按钮,可以看到如下图所示:

我们再切换到 xiaomiDebug,再次运行程序,可以看到:

可以看到,当我们运行不同渠道的应用程序时,CHANNEL_VALUE 的值是不一样的。这样,我们就在代码中区分当前渠道是什么渠道了。

  • 如果我们不单单想要区分不同商店的包,还要区分相同商店不同类型的包,比如在华为上架了两个包,一个是免费版,一个是付费版。那么我们就需要在 flavorDimensions 中再添加一个风味维度(比如 mode),然后在 productFlavors 中再添加对应的产品风味就行,代码如下:
flavorDimensions "channel", "mode"
productFlavors {huawei {manifestPlaceholders = [CHANNEL_VALUE: "huawei"]// dimension 用于标识该产品风味属于 channel 这个风味维度dimension "channel"}xiaomi {manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"]dimension "channel"}free {// 除了用 manifestPlaceholders, 也可以通过 buildConfigField 来配置信息buildConfigField "boolean", "IS_VIP", "false"dimension "mode"}pro {buildConfigField "boolean", "IS_VIP", "true"dimension "mode"}
}

再同步一下项目,我们可以在左侧的 Build Variants 中看到,Active Build Variant这一选项又有了变化,结果如下:

同样,我们修改一下 MainActivity 的代码来验证一下:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 获取 channel 信息Log.d(TAG, "CHANNEL: ${getAppChannel()}")// 获取 mode 信息Log.d(TAG, "IS_VIP: ${isVipMode()}")}private fun getAppChannel(): String? {val metadata =packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA).metaDatareturn metadata.getString("CHANNEL")}private fun isVipMode(): Boolean {return BuildConfig.IS_VIP}companion object {private const val TAG = "MainActivity_Flavor"}
}

Android studio 左侧的 Build Variants 选择 xiaomiProDebug ,编译运行之后可以看到如图所示

我们再切换到 huaweiFreeDebug,再次运行程序,可以看到:

所以,通过这种方式,我们就可以在代码中判断是什么渠道什么类型的 Apk 包了。

四、关于渠道包的数量

上述例子中,每一个渠道包由 [channel][mode][buildType] 组成, 总数量为 [channel 风味组成员数量] _ [mode 风味组成员数量] _ [buildType(构建类型,没特殊设置的话,则是 debug 或 release 其中一种)类型数量] ,如例子中则为 2 * 2 * 2 = 8。

五、最后

关于多渠道打包,还有比较多的内容需要学习了解,这里只是简单介绍一下最基本的官方多渠道打包方式,如有错误的地方,欢迎指出,谢谢。

Android 官方多渠道打包相关推荐

  1. 【Android】多渠道打包与签名机制

    [Android]多渠道打包与签名机制 多渠道打包 我们在发布APP时,往往需要生成多个渠道包,以上传到不同的应用市场. 而每个渠道包中,都可以包含各自的渠道信息,当APP和后台交互或进行数据上报时, ...

  2. android中多渠道打包的三种方式

    转载至:一片枫叶的专栏 国内的Android开发者还是很苦逼的,由于众所周知的原因,google play无法在国内打开(翻墙的就不在考虑之内了),所以Android系的应用市场,群雄争霸.后果就是国 ...

  3. Android的多渠道打包

    前言 本篇包括以下内容: 多渠道打包概述 友盟的多渠道打包 美团的多渠道打包 360的多渠道打包 多渠道打包概述 什么是多渠道包 渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠 ...

  4. android快速打包工具下载,【Android】多渠道打包,其实可以更快

    现状 多渠道打包,相信很同学都知道.在Android Studio中只要经过配置,就能打出对应市场的渠道包.打过包的同学可能都会有这样的感受:散热器疯狂地转.打包速度那叫一个慢.这时候除了无奈,还是无 ...

  5. Android Studio 多渠道打包、自动版本号及 gradlew 命令的基本使用

    Android Studio 真可谓神器,详细请点这里:打造安卓开发航空母舰 这里介绍其多渠道打包: 1 建立多渠道 这里介绍一种简单的,直接as操作: 直接上图咯,在项目结构你添加flavor就好了 ...

  6. android 自定义apk名,Android Studio多渠道打包、自定义打包APK名称

    现在为了推广产品,会在多个渠道应用市场发布应用,为了统计不同渠道的数据,需要在应用中表明渠道,如果一个一个去修改打包效率会很低.AS为我们提供了简便的方法,可以多渠道打包,一次打包所有的渠道包. 1. ...

  7. Android之Android Studio--Gradle多渠道打包

    于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废话 ...

  8. Android Gradle 多渠道打包、动态配置AppName

    目录 一.简介 二.Gradle多渠道打包 1.普通做法 2.Gradle多渠道打包 一.简介 因为国内Android应用分发市场的现状,我们在发布APP时,一般需要生成多个渠道包,上传到不同的应用市 ...

  9. android百度多渠道打包,Android多渠道打包方案的实践与优化

    目前使用过的多渠道打包方式有两种 ,一种是通过gradle打包,还有一种是美团的多渠道打包方案具体详情见这里 1.Gradle打包 1.1.在Androidmanifest.xml中添加 androi ...

最新文章

  1. JavaEE学习笔记之Servlet
  2. 算法:买卖股票的最佳时机含冷冻期
  3. 输入快捷键显示未知命令_「干货」华为VRP基础和常用命令了解一下
  4. 结型场效应管的结构、特性、参数
  5. (4)编写一个程序,输出三角形字符阵列图形
  6. FLEX常用验证控件
  7. 《Docker:容器与容器云》.pdf
  8. 状态模式(Unity中使用)
  9. 使用JSONObject toString后,会增加反斜杠转义符
  10. springboot 项目中控制台打印日志以及每天生成日志文件
  11. JAVA md5加盐加密解密_md5加密,md5加盐加密和解密
  12. 给c++程序员的一份礼物——常用工具集
  13. 耐人寻味的Temp文件(二)
  14. LRC (Lyric) 字幕
  15. 关于c#实现影音嗅探的问题(转)
  16. leetcode每日一题-字符串中的第一个唯一字符
  17. MySQL讲义第50讲——select 查询之查询练习(八):查询每门课程成绩前三名的学生信息
  18. wps 字体对系统无效_linux版WPS系统缺失字体的解决办法
  19. Unity中实现赛车游戏
  20. 李建忠设计模式之总结

热门文章

  1. 错误代码:-118无法载入网页(未知错误)。解决方案
  2. 计算机软件著作权常见补正通知及应对方法
  3. C语言习题练习7——英文单词排序
  4. 【汇智学堂】-python小游戏(弹球游戏之六-类的使用中体会坐标位置)
  5. War3ArtTools学习笔记
  6. CS5260电路参考|Type-C转VGA转换器方案|Type-C转VGA转接线方案
  7. JavaScript 习题:如何获取一个字符串中的数字字符,并按数组形式输出,如 bdjhs113fdfd456fnsd789djnskd 输出 [113,456,789]
  8. C# Microsoft.Office.Interop.Excel 引用的用法
  9. 数据结构和算法——基于Java——1.数组
  10. Niagara内容示例 2.2 Dynamic Beam