应用场景:
1. 将渠道中参数进行统一管理。
2.该项目需要生成三个不同包名应用, 包括应用图标, 分享图标, 启动页,应用名称,友盟后台key, 微信QQ微博,推送等KEY,渠道名,渠道号
目的:统一管理,简洁代码,方便维护
思路: 设置渠道时, 先不要在渠道内设置任何参数, 在渠道设置完成后, 拿到渠道的集合对象,遍历,通过渠道名来识别不同版本,然后设置不同的key,渠道号, 包名,设置图标等参数
实现步骤
第一步:在android{}中添加渠道,如下图,里面不要做任何配置
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 + "\"") }
还有一个方法是关于设置渠道号的, 同理, 创建一个方法, 传入渠道名, 根据渠道名, 可以判断对应的渠道号。