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")
    }
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值