gradle批量配置productFlavors(渠道)

应用场景:

1. 将渠道中参数进行统一管理。 

2.该项目需要生成三个不同包名应用, 包括应用图标, 分享图标, 启动页,应用名称,友盟后台key, 微信QQ微博,推送等KEY,渠道名,渠道号

目的:统一管理,简洁代码,方便维护


思路: 设置渠道时, 先不要在渠道内设置任何参数, 在渠道设置完成后, 拿到渠道的集合对象,遍历,通过渠道名来识别不同版本,然后设置不同的key,渠道号, 包名,设置图标等参数


实现步骤

第一步:在android{}中添加渠道,如下图,里面不要做任何配置

gradle批量配置productFlavors(渠道)_第1张图片


 productFlavors {
          
            _360_genius {}
            baidu_genius {}
            xiaomi_genius {}
            yingyongbao_genius {}
            huawei_genius {}
            yingyonghui_genius {}
            meizu_genius {}
            anzhi_genius {}
            wandoujia_genius {}
            ppzhushou_genius {}
            nduo_genius {}
            youyishichang_genius {}
            oppo_genius {}
            sougou_genius {}
            jifeng_genius {}
            mumayi_genius {}
            lenovo_genius {}
            jufeng_genius {}
          
        }


步骤二:拿到集合对象,遍历集合,拿到单个渠道对象, 再通过该对象拿到该渠道名, 通过渠道名分别设置不同参数;

//批量配置
//获取渠道集合
def flavors = getProductFlavors();
for (int i = 0; i < flavors.size(); i++) {
    //获取渠道对象
    def at = flavors.getAt(i);
    //获取渠道名
    def name = at.getName().toString();
    //设置清单文件参数集合
    at.manifestPlaceholders = getCustomManifestPlaceholders(name);
    //设置appliactionId
    at.applicationId = getCustomApplicationId(name)

    at.buildConfigFields.clear()
    setFlavoerData(at);
}

意: 上面遍历集合时调用了三个方法

该方法传入渠道名,返回manifestPlaceholders(清单文件)  所需要的集合。返回的数据是清单文件中通过${参数名}所需要调用的数据;

getCustomManifestPlaceholders(name);

备注:该方法中配置了图标,启动样式,微信分享回调所需的Activity路径, 推送权限等等, 这些都是清单文件中所需要的。


通过这个方法我们就可以将这个集合设置好了。以后有任何变动,都只需要改这一个方法了, 不需要再去修改渠道里面的参数了。而且可以方便配置多个版本的参数;  

gradle语方法: 返回值默认最后一行, 不需要写return xxx; 例如我这个方法中return map; 与只写map 的效果是一样的;返回的类型需要标注一下;


/获取mainfestpalaceholers集合
def Map<String, Object> getCustomManifestPlaceholders(String floverName) {
    def jpPath = ".permission.JPUSH_MESSAGE";
    def wxPath = ".wxapi.WXEntryActivity";

    def applicationId = "";
    def UMENG_CHANNEL = "";
    def icon = "";
    def app_name = "";
    def UMENG_APPKEY = "";
    def JPUSH_APPKEY = "";
    def PACKAGE_NAME = "";
    def QQ_SCHEME = "";
    def app_start_style = "";
    def PERMISSION_JPUSH_MESSAGE = "";
    def WX_PACKAGE = "";

    UMENG_CHANNEL = floverName
    if (floverName.contains(GENIUS)) {
      
        applicationId = " "
        PERMISSION_JPUSH_MESSAGE = applicationId + jpPath
        WX_PACKAGE = applicationId + wxPath

        icon = "@drawable/icon_launcher_genius"
        app_name = "XXX"
        UMENG_APPKEY = "XXXX"
        JPUSH_APPKEY = "XXX"
        PACKAGE_NAME = "XXX"
        QQ_SCHEME = "XXX"
        app_start_style = "@style/StartActivityTheme_genius"

    } else if (floverName.contains(OAS)) {
        //....
    } else {
        //....
       
    }

    Map map = new HashMap()
    map.clear()
    map.put("UMENG_CHANNEL", UMENG_CHANNEL)
    map.put("UMENG_CHANNEL", UMENG_CHANNEL);
    map.put("icon", icon);
    map.put("app_name", app_name);
    map.put("UMENG_APPKEY", UMENG_APPKEY);
    map.put("JPUSH_APPKEY", JPUSH_APPKEY);
    map.put("PACKAGE_NAME", PACKAGE_NAME);
    map.put("QQ_SCHEME", QQ_SCHEME);
    map.put("app_style", app_start_style);
    map.put("PERMISSION_JPUSH_MESSAGE", PERMISSION_JPUSH_MESSAGE);
    map.put("WX_PACKAGE", WX_PACKAGE);
    map
}



getCustomApplicationId方法就是返回一个字符串,字符串的内容就是包名, 与上面同理;


at.buildConfigFields.clear()
    setFlavoerData(at);

这个方法是设置渠道中BuildConfigField字段。我们在完成编译时,会自动生成BuildConfig文件,这个文件里面有很多字段,就是BuildconfigField。

例如我们需要添加一个渠道号字段, 一般的做法如下, 所代表的意思是创建字段类型为String, 字段名: CHANNER_NUM,值为9;用于方便后台统计每个市场上下载的安装包数量;

备注: 请注意赋值时, 加了单引号

渠道名 {
buildConfigField 'String', 'CHANNEL_NUM', '"9"'

。。。。

}


思路,通过渠道对象,先拿到该渠道的Buildconfigfield的集合buildconfigfields;上面at是渠道对象, at.buildConfigFields就是拿到该集合对象,这是gradle的api;直接先将其清除,然后通过setFlvoerData(at)方法, 将渠道对象传递给这个方法;通过该对象进行添加所有字段。

如果大家没有将一个项目打成多个包的需求, 不需要写我这下if else等判断,直接将字段进行赋值即可。 

备注:

1. 由于gralde版本的不同, API有所不同,有的gradle版本中有crateBuildConfig的API,有的是没有的。 保险起见我给大家使用

productFlavor.buildConfigField("String", "DOMAIN", "\"" + DOMAIN + "\"")

2.上面最后赋值时请必须加引号 , 否则会报错,gradle编译后会认为这个不是字符串型,这跟gradle语法有关;

def setFlavoerData(com.android.build.gradle.internal.dsl.ProductFlavor productFlavor) {
    def CHANNEL_NUM = null//渠道号
    def DOMAIN = null//区分版本
    def UPDATE_ID = null//bugly升级id
    def SinaAppId = null//新浪id
    def SinaAppSecret = null
    def QQAppId = null
    def QQAppSecret = null
    def WXAppId = null
    def WXAppSecret = null

    def domin_value = null
    def name = productFlavor.getName();
    CHANNEL_NUM = getChannelValue(name);
    if (name.contains(GENIUS)) {
        domin_value = "2"
        DOMAIN = domin_value
        UPDATE_ID = "xxx"
        SinaAppId = "xxx"
        SinaAppSecret = "xxx"
        QQAppId = "xxx"
        QQAppSecret = "xxx"
        WXAppId = "xxx"
        WXAppSecret = "xxx"


    } else if (name.contains(OAS)) {
         
    } else {
         
    }

    productFlavor.buildConfigField("String", "DOMAIN", "\"" + DOMAIN + "\"")
    productFlavor.buildConfigField("String", "CHANNEL_NUM", "\"" + CHANNEL_NUM + "\"")
    productFlavor.buildConfigField("String", "UPDATE_ID", "\"" + UPDATE_ID + "\"")
    productFlavor.buildConfigField("String", "SinaAppId", "\"" + SinaAppId + "\"")
    productFlavor.buildConfigField("String", "SinaAppSecret", "\"" + SinaAppSecret + "\"")
    productFlavor.buildConfigField("String", "QQAppId", "\"" + QQAppId + "\"")
    productFlavor.buildConfigField("String", "QQAppSecret", "\"" + QQAppSecret + "\"")
    productFlavor.buildConfigField("String", "WXAppId", "\"" + WXAppId + "\"")
    productFlavor.buildConfigField("String", "WXAppSecret", "\"" + WXAppSecret + "\"")
}



还有一个方法是关于设置渠道号的, 同理, 创建一个方法, 传入渠道名,  根据渠道名, 可以判断对应的渠道号。 











你可能感兴趣的:(andriod)