Gradle 多渠道打包

随着项目中渠道的越来越多,终于要面对多渠道打包了(技术债是要还的),昨天花了2个小时学习了一下,下面将快速集成步骤写出来


  1.  在app的build.gradle中添加渠道,这里渠道我用双引号包住,其实如果首字母非数字也可以不用双引号
    productFlavors {
            "baidu" {}
            "QQ" {}
            "OPPO" {}
            "vivo" {}
            "Huawei" {}
            "xiaomi" {}
            "meizu" {}
            "360" {}
            "sanxing" {}
        }
    
    //给上述渠道分别配置属性
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [InstallChannel: name]
        }
    

    代码中的InstallChannel 是可以自定义的,但是需要和下面步骤中的InstallChannel 相对应,此时build一下你可能会报错

    Error:All flavors must now belong to a named flavor dimension.Learn more at 
     https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

    因为在studio 3.0以后添加了flavorDimensions的方式,定义风味维度(也就是命名风味维度)。
    解决方法:

    defaultConfig {
            applicationId "com.demo.flavorsapp"
            minSdkVersion 18
            targetSdkVersion 27
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
             flavorDimensions "versionCode"
        }

    对,就是最后一行的代码。

  2. 然后配置一下多渠道打包的输出路径:(因为默认的话是在项目每个渠道都创建一个文件夹,难道还要一个一个从文件夹cv出来嘛?!)
    这个也是在app的build文件中配置的,我定义的是,多渠道包的输出路径和之前没有配置多渠道时候的默认路径一样,所有的多渠道包都在这个路径下面,而且多渠道包的命名格式是Huawei_1.apk,这个命名格式是outputFileName 配置的

     //gradle3.0以上可用
        android.applicationVariants.all { variant ->
            variant.outputs.all {
                variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/app/release")
                outputFileName = "${variant.getFlavorName()}_${variant.versionCode}.apk"
            }
        }
    
    
    //   gradle3 3.0以下(待验证)
    
    /*    applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def outputFile = output.outputFile
                if (outputFile != null && outputFile.name.endsWith('.apk')) {//输出apk名称为:渠道名_版本名_时间.apk 
                    def fileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${releaseTime()}.apk" output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }*/

     

  3. 然后配置清单文件

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

    注意你的InstallChannel  这个是和上面步骤中的InstallChannel 对应的

  4. 至此已经配置完成了,如果你项目中需要用到这个渠道的字段,比如传给后台的参数中需要这个渠道名,那么可以用过下面方法获取: 

     /**
         * 获取渠道名字
         *
         * @param context
         * @return
         */
        public static String getsDeviceName(Context context) {
            String channelName = "";
            PackageManager packageManager = context.getPackageManager();
            try {
                if (packageManager != null) {
                    ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
                    if (applicationInfo != null) {
                        if (applicationInfo.metaData != null) {
                            channelName = applicationInfo.metaData.getString("InstallChannel");
                        }
                    }
                }
            } catch (Exception e) {
            }
            return channelName;
        }

    applicationInfo.metaData.getString("InstallChannel")的参数 注意与上面步骤一致

  5. 打包:选择你想要的渠道就可以


    在最后,有些机智的小伙伴可能就要问了,我想在平时debug运行在手机测试的时候指定自己想要的渠道,这咋办?!
    有办法:

    在这里就可以指定渠道啦!
     

  6. 是不是发现多渠道打包如此简单?如果这篇文章帮助到您了,请给我个赞,谢谢~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值