Android (一杯茶的时间搞掂)productFlavors多渠道打包

前段时间有个坑,项目发布到Google应用市场后,apk被Google二次签名了,导致在Google市场上面下载的用户无法替换安装OTA上面的最新版本(无法互相替换安装),只能通过Google市场更新。目前发布渠道有Google、和官网二维码下载(官网OTA)。

然而用户群体都是“刁钻的”、“不讲理的”。无法更新这是个非常严重的问题,直接影响体验,增加卸载率和不良口碑。

经过一番研究,决定采用多渠道打包的方式,区分渠道包。不同的渠道包采用不同的更新方式。例如Google市场的渠道包,引导跳转到Google应用市场更新;而其他安装不存在签名问题的包则可以通过官网链接下载替换安装的方式更新。

接下来我们来看看如何操作,基于Android Studio3.1+版本:

1、在 AndroidManifest.xml 中加入meta值,设置为变量名为:APP_CHANNEL_VALUE

    <meta-data android:name="APP_CHANNEL" android:value="${APP_CHANNEL_VALUE}"/>

2、 app的 build.gradle 配置(这里只配置打包两个渠道,分别是google和小米商城):

android {
    //...
    defaultConfig {
        // 版本信息...

        // 维度,解决报错
        flavorDimensions "versionCode"
    }

    buildTypes {
        // 混淆配置...
    }

    // 配置打包渠道的APP_CHANNEL_VALUE值
    productFlavors{
        wandoujia{
            manifestPlaceholders = [APP_CHANNEL_VALUE: "google"]
        }
        xiaomi{
            manifestPlaceholders=[APP_CHANNEL_VALUE: "xiaomi"]
        }
    }
    
    // 获取渠道名
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [APP_CHANNEL_VALUE: name]
    }

    // 生成打包apk的文件名
    applicationVariants.all { variant ->
        variant.outputs.all {
            // 日期信息
            def fileName
            def date = new Date()
            def formattedDate = date.format('yyyyMMdd')
            if (variant.buildType.name.equals('release')) {
                fileName = "${defaultConfig.versionName}_release_${formattedDate}.apk"
            } else if (variant.buildType.name.equals('debug')) {
                fileName = "${defaultConfig.versionName}_debug_${formattedDate}.apk"
            }
            outputFileName = fileName;
        }
    }
}

dependencies {
    // 依赖...
}

如果 defaultConfig 中没有 flavorDimensions "versionCode",会报一下错误。

3、在代码中获取渠道名(APP_CHANNEL_VALUE)

    /**
     * 获取渠道名
     */
    private String getChannel() {
        try {
            PackageManager pm = getPackageManager();
            ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            return appInfo.metaData.getString("APP_CHANNEL");
        } catch (PackageManager.NameNotFoundException ignored) {
        }
        return "";
    }

4、根据渠道名,进行其他操作,如区分访问链接,更新途径,用户群体来源统计信息等等。

      ...

5、打包,Build > Generate Signed Apk,app目录下将生成渠道目录,以及里面包含的apk

6、运行结果:

将获取的 APP_CHANNEL 显示

总结,其实多渠道打包并不神秘,只是通过meta标识apk,不同的渠道包,APP_CHANNEL值也不同。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值