Android 官方多渠道打包
一、前言
在 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这一选项,已经由原来的 debug 和 release 2项变为如下 4 项:
分别是 huaweiDebug 和 huaweiRelease,以及 xiaomiDebug 和 xiaomiRelease。
可能这里就有小伙伴要问了:“不同的渠道包是有了,但是要怎样判断当前是什么渠道包,这样我才能完成有关渠道的业务需求啊?”
这个问题问得好。
我们在完成上面的操作之后呢,是可以打出不同的渠道包了,不过还缺少了一个最重要的环节,就是给不同的产品风味写入不同的配置信息,这样我们才能根据不同的配置信息来判断是哪个渠道的包。我们修改一下 build.gradle中的代码,修改后代码如下:
android {//省略其他无关代码...flavorDimensions "channel"productFlavors {huawei {manifestPlaceholders = [CHANNEL_VALUE: "huawei"]// dimension 用于标识该产品风味属于 channel 这个风味维度dimension "channel"}xiaomi {manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"]dimension "channel"}}
}
可以看到,我们给每一个产品风味都添加了一个 manifestPlaceholders ,里面有一个 key - value,key 都是 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 Variant到 huaweiDebug,然后点击一下运行按钮,可以看到如下图所示:
我们再切换到 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 官方多渠道打包相关推荐
- 【Android】多渠道打包与签名机制
[Android]多渠道打包与签名机制 多渠道打包 我们在发布APP时,往往需要生成多个渠道包,以上传到不同的应用市场. 而每个渠道包中,都可以包含各自的渠道信息,当APP和后台交互或进行数据上报时, ...
- android中多渠道打包的三种方式
转载至:一片枫叶的专栏 国内的Android开发者还是很苦逼的,由于众所周知的原因,google play无法在国内打开(翻墙的就不在考虑之内了),所以Android系的应用市场,群雄争霸.后果就是国 ...
- Android的多渠道打包
前言 本篇包括以下内容: 多渠道打包概述 友盟的多渠道打包 美团的多渠道打包 360的多渠道打包 多渠道打包概述 什么是多渠道包 渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠 ...
- android快速打包工具下载,【Android】多渠道打包,其实可以更快
现状 多渠道打包,相信很同学都知道.在Android Studio中只要经过配置,就能打出对应市场的渠道包.打过包的同学可能都会有这样的感受:散热器疯狂地转.打包速度那叫一个慢.这时候除了无奈,还是无 ...
- Android Studio 多渠道打包、自动版本号及 gradlew 命令的基本使用
Android Studio 真可谓神器,详细请点这里:打造安卓开发航空母舰 这里介绍其多渠道打包: 1 建立多渠道 这里介绍一种简单的,直接as操作: 直接上图咯,在项目结构你添加flavor就好了 ...
- android 自定义apk名,Android Studio多渠道打包、自定义打包APK名称
现在为了推广产品,会在多个渠道应用市场发布应用,为了统计不同渠道的数据,需要在应用中表明渠道,如果一个一个去修改打包效率会很低.AS为我们提供了简便的方法,可以多渠道打包,一次打包所有的渠道包. 1. ...
- Android之Android Studio--Gradle多渠道打包
于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废话 ...
- Android Gradle 多渠道打包、动态配置AppName
目录 一.简介 二.Gradle多渠道打包 1.普通做法 2.Gradle多渠道打包 一.简介 因为国内Android应用分发市场的现状,我们在发布APP时,一般需要生成多个渠道包,上传到不同的应用市 ...
- android百度多渠道打包,Android多渠道打包方案的实践与优化
目前使用过的多渠道打包方式有两种 ,一种是通过gradle打包,还有一种是美团的多渠道打包方案具体详情见这里 1.Gradle打包 1.1.在Androidmanifest.xml中添加 androi ...
最新文章
- JavaEE学习笔记之Servlet
- 算法:买卖股票的最佳时机含冷冻期
- 输入快捷键显示未知命令_「干货」华为VRP基础和常用命令了解一下
- 结型场效应管的结构、特性、参数
- (4)编写一个程序,输出三角形字符阵列图形
- FLEX常用验证控件
- 《Docker:容器与容器云》.pdf
- 状态模式(Unity中使用)
- 使用JSONObject toString后,会增加反斜杠转义符
- springboot 项目中控制台打印日志以及每天生成日志文件
- JAVA md5加盐加密解密_md5加密,md5加盐加密和解密
- 给c++程序员的一份礼物——常用工具集
- 耐人寻味的Temp文件(二)
- LRC (Lyric) 字幕
- 关于c#实现影音嗅探的问题(转)
- leetcode每日一题-字符串中的第一个唯一字符
- MySQL讲义第50讲——select 查询之查询练习(八):查询每门课程成绩前三名的学生信息
- wps 字体对系统无效_linux版WPS系统缺失字体的解决办法
- Unity中实现赛车游戏
- 李建忠设计模式之总结
热门文章
- 错误代码:-118无法载入网页(未知错误)。解决方案
- 计算机软件著作权常见补正通知及应对方法
- C语言习题练习7——英文单词排序
- 【汇智学堂】-python小游戏(弹球游戏之六-类的使用中体会坐标位置)
- War3ArtTools学习笔记
- CS5260电路参考|Type-C转VGA转换器方案|Type-C转VGA转接线方案
- JavaScript 习题:如何获取一个字符串中的数字字符,并按数组形式输出,如 bdjhs113fdfd456fnsd789djnskd 输出 [113,456,789]
- C# Microsoft.Office.Interop.Excel 引用的用法
- 数据结构和算法——基于Java——1.数组
- Niagara内容示例 2.2 Dynamic Beam