Gradle 多渠道打包

之前公司没有涉及多渠道,所以现家用的时候现学的,整理下自己的使用心得;

1:清单中定义meta-data标签 属性name和value 

    

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

如果使用umeng多渠道,可以将名称修改下

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


2:build.gradle中添加渠道

     owner是自己定义的,用于区分其他渠道,自己的下载链接.   

    productFlavors{
        xiaomi{}
        wandoujia{}
        huawei{}
        oppo{}
        yingyongbao{}
        vivo{}
        _360{}
        baidu{}
        owner{}
    }
    productFlavors.all{
        flavor->flavor.manifestPlaceholders=[CHANNEL_VALUE:name]
    }

 3:获取渠道号

 public static String getsDeviceName(Context context,String key){
        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(key);
                    }
                }
            }
        }catch (Exception e){

        } 
        return channelName;
}

4:渠道号可添加到请求的header中传给后端. 

第三步和第四步如果是友盟是不需要的.

另外多说一句,友盟初始化的方法中init()

UMConfigure.init(this,Config.UMENG_APP_KEY,"",UMConfigure.DEVICE_TYPE_PHONE,"");
第三个参数指的就是渠道,如果清单中设置过,这里传空,否则会覆盖清单的渠道!!!!!


另外打包时修改输出文件名

gradle3.0以上 

android.applicationVariants.all { variant ->
            variant.outputs.all {
                outputFileName = "coinplus_${variant.getFlavorName()}_v${variant.versionName}.apk"
            }
        }

variant.getFlavorName()获取的是渠道名如果希望带着release或者debug可以调用
variant.name


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)
                    }
                }
            }



猜你喜欢

转载自blog.csdn.net/qq_23025319/article/details/80449734