Android多渠道打包配置方案
背景
多渠道打包,顾名思义就是用来区分同一个软件,在不同渠道上的释放版本。
这个手机上大型app几乎是必配置的一个项,给不同型号的手机所用的apk会做一些细微的区别。像笔者使用酷安社区比较多,在官网下载的酷安apk界面顶部有软件管理功能,在其他手机厂的应用商店里下载的酷安就没有这个功能。
目前我们有需求是要一套软件代码库多个项目共同使用,针对不同的项目打包不同的渠道apk,现学记录一下。
Gradle脚本和Manifest文件配置
不同渠道的apk既然要做细微的功能上的区分,就需要在代码里能拿到一个类似键值对的标志位。并且能够全局调用。首先我们需要在app级的gradle文件里配置不同的channel名称。
其中flavorDimensions和productFlavors中的维度名称需要一一对应。随便写一个"default"即可。
defaultConfig { xxxx = xxxx flavorDimensions.add("default") }
gradle.kts语法与Groovy略有不同,要添加自己配置的东西一般是使用create,register之类的关键字,不熟悉配置的可以先试试。
不同渠道包的域里,我们可以区分很多参数值,像这里我是配置了不同渠道使用不同平台的签名。
productFlavors { create("cheetah") { dimension = "default" signingConfig = signingConfigs.getByName("cheetah") manifestPlaceholders["CHANNEL_VALUE"] = "cheetah_channel" } create("redfin") { dimension = "default" signingConfig = signingConfigs.getByName("aaos") manifestPlaceholders["CHANNEL_VALUE"] = "redfin_channel" } }
为了可以设置成自己想要的键值对,建议在Manifest清单文件里设置一组元数据,在打包时让Gradle去赋值它。结合上下两段代码,我们在Manifest里的一组元数据,key设为CHANNEL,value为引用型的变量CHANNEL_VALUE,在Gradle渠道配置里,我们使用:
manifestPlaceholders["CHANNEL_VALUE"] = "cheetah_channel"
来为其赋值。
<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}" />
打包时,可以通过判断flavor的名称,来输出不同的apk名字。
android.applicationVariants.configureEach { outputs.all { if (this is com.android.build.gradle.internal.api.ApkVariantOutputImpl) { if (flavorName == "redfin") { this.outputFileName = "RedfinChannel_V${versionName}.apk" } else if (flavorName == "cheetah") { this.outputFileName = "CheetahChannel_V${versionName}.apk" } } } }
代码调用
全局性的打包配置完毕后,我们如何在代码里去使用区分不同渠道呢。
这里也有两种方法来获取,一种是直接拿取Gradle脚本里创建时的渠道名,直接通过BuildConfig类的FLAVOR字段来获取;一种是拿取我们在Manifest里设置的元数据的value值,操作稍复杂一些。具体代码如下:
object FlavorConfig { const val REDFIN = "redfin" const val CHEETAH = "cheetah" private var manifestMetaData = "" private var gradleData = "" init { val appInfo = appContext.packageManager.getApplicationInfo( appContext.packageName, PackageManager.GET_META_DATA ) manifestMetaData = appInfo.metaData.getString("CHANNEL") as String gradleData = BuildConfig.FLAVOR } fun getMetaDataOne() = manifestMetaData.apply { infoLog("metaData value: $this") } fun getMeatDataTwo() = gradleData.apply { infoLog("gradle metaData value: $this") } }
到此这篇关于Android多渠道打包配置方案的文章就介绍到这了,更多相关Android打包配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
ScrollView与ListView合用(正确计算Listview的高度)的问题解决
最近做项目中用到ScrollView和ListView一起使用的问题,显示的时候ListView不能完全正确的显示,查了好多资料终于成功解决:2013-05-05Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解
这篇文章主要介绍了Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法,结合实例形式详细分析了Android操作SQLite数据库及使用ListView显示数据的相关技巧,需要的朋友可以参考下2016-02-02Android ViewPager无限循环实现底部小圆点动态滑动
这篇文章主要为大家详细介绍了Android ViewPager无限循环实现底部小圆点动态滑动的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-03-03解决Android Studio一直停留在MyApplication:syncing的问题
这篇文章主要介绍了Android Studio一直停留在MyApplication:syncing的完美解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10Android android:exported = true 用法详解
在本篇文章里小编给大家整理了关于Android android:exported = true 用法,需要的朋友们参考下。2019-09-09
最新评论