U8SDK——渠道SDK的动态升级(版本区分)
最近有童鞋和我谈到了渠道SDK的版本更新问题,也就是在实际SDK接入工程中,可能会遇到以下两种情况:
1、SDK打包可否交给运营来做,现在的模式下,交给运营来做,很不方便。因为某个渠道SDK有问题,几乎涉及到代码的修改,而修改了代码,就要重新打生成jar包,然后更新打包工具,这样研发和运营在协调上,很耗时间。
2、多个游戏使用u8sdk时,有一个版本区分的问题。比如公司当前有两款游戏,A已经上线,并且接入了UC的3.5版本;现在B游戏也要开始接UC的渠道,
但是目前UC的渠道SDK最新版本是4.0,而且关键是SDK的登录认证和支付回调发生了变化,和之前的3.5版本不兼容。但是A游戏,暂时还不能升级SDK,必须等到下次游戏更新的时候才能同时升级UC的SDK那么这个时候,
U8Server这边就要区分UC SDK的版本,针对3.5版本和4.0版本各有一个登录认证,和支付回调的版本这个时候,u8server怎么来区分当前游戏要采用3.5还是4.0的版本针对第一个问题,
需要将渠道SDK的接入开发工作和运营打包工具能更好的解开耦合,更多地是需要一个更好的流程。
那么,这里,我们可以对各个渠道SDK进行版本控制,并且实现动态更新机制。
1)所有接好的渠道SDK,按照某种格式存放在服务器上,同时有一个版本控制文件,里面罗列服务器上当前所有的渠道SDK名称和当前最新的版本
2)打包工具运行的时候,先去服务器上获取版本控制文件,和本地上一次获取到的版本控制文件比对,从而获得新增的渠道和需要更新的渠道
3)然后可以手动或者自动 选择更新哪些渠道SDKPS:对于U8SDK,目前增值服务中,提供不同的版本,而且每个购买者,选择的渠道SDK可能各不相同。购买者选购的渠道SDK,我们这边升级的时候为了使得他们那边的选购的那些渠道SDK可以自动更新,而没有选购的渠道SDK则不会更新到,我们可以采用用户管理和上面提到的版本控制来一起完成。服务器上需要记录A童鞋的帐号和选购的渠道SDK。然后A童鞋在运行打包工具的时候,传用户名和密码等信息到服务器,服务器查找A童鞋选购的渠道SDK,然后生成一份版本控制文件,下发给A童鞋的打包工具。(仅仅设想,还没实现)
针对第二个问题,也就是u8server上可能同一个渠道SDK,存在多个版本,而客户端在登录认证的时候,u8server需要知道当前使用哪个版本。因为u8server是统一的用户登录中心和支付中心,多个游戏使用同一个u8server。
所以,我们需要一个各个渠道SDK和u8server之间的一个版本约定下面,先在u8sdk的打包工具中,增加两个地方的版本号,分别为了后面实现上面说的两个问题打一个基础。在每个渠道SDK的配置目录下,之前我们是有一个sdk_config.xml(有的童鞋那里可能叫config.xml),现在,在这个文件中,我们增加一个版本号这个版本号主要用于渠道SDK的版本检查,来做渠道SDK的动态更新机制。
1 2 3 4 5 |
<version> <versionCode>1</versionCode> <versionName>3.5.3.1</versionName> </version> |
PS:versionCode用来和资源服务器上检查版本更新使用的,每次版本更新,自然增长即可。versionName仅仅标注当前对应的渠道SDK版本。显示使用然后,我们需要修改下打包脚本,增加对version的解析:config_utils.py的loadChannelUserConfig方法,需要在paramNodes = configNode.find(“params”)之前增加
1 2 3 4 5 6 7 8 9 |
versionNode = configNode.find("version") if versionNode != None and len(versionNode) > 0: versionCodeNode = versionNode.find("versionCode") versionNameNode = versionNode.find("versionName") if versionCodeNode != None and versionNameNode != None: channel['sdkVersionCode'] = versionCodeNode.text channel['sdkVersionName'] = versionNameNode.text |
这样,后面做打包工具中渠道SDK的更新,我们就利用这里sdkVersionCode来实现。这里先解析到channel对象中,后面真正实现的时候,我们可以根据远程获取到的版本控制文件,然后从各个SDK的配置目录中解析version来,判断是否需要更新。然后,在游戏支持的渠道配置文件(config.xml)中的channels/channel节点中也增加一个版本号:
1 2 3 4 5 |
<sdk-version> <versionCode>1</versionCode> <versionName>3.5.3.1</versionName> </sdk-version> |
PS:versionCode在登录认证的时候,传到u8server,u8server根据versionCode去选择当前使用渠道SDK对应哪个版本的登录认证方式。versionName仅仅是给人看的,不做其他用途。同样地,我们需要修改下打包脚本,增加对version的解析:
1 2 3 4 5 6 7 8 |
sdkVersionNode = cNode.find('sdk-version') if sdkVersionNode != None and len(sdkVersionNode) > 0: versionCodeNode = sdkVersionNode.find('versionCode') versionNameNode = sdkVersionNode.find('versionName') if versionCodeNode != None and versionNameNode != None: channel['sdkLogicVersionCode'] = versionCodeNode.text channel['sdkLogicVersionName'] = versionNameNode.text |
然后,我们需要将sdkLogicVersionCode写入到assets目录下的developer_config.properties中,所以,在config_utils.py中的writeDeveloperProperties方法中,在proStr = proStr + “U8_Channel=” + channel[‘id’] + “\n”之前,加上
1 2 3 |
if "sdkLogicVersionCode" in channel: proStr = proStr + "U8_SDK_VERSION_CODE=" + channel["sdkLogicVersionCode"] + "\n" |
上面这个是python3.4下的。如果你当前使用的是python2.7。那么需要将上面的代码换为:
1 2 3 |
if channel.has_key("sdkLogicVersionCode"): proStr = proStr + "U8_SDK_VERSION_CODE=" + channel["sdkLogicVersionCode"] + "\n" |
最后,我们需要在U8SDK抽象层中来读取U8_SDK_VERSION_CODE。所以在U8SDK单例类中,我们增加一个方法:
1 2 3 4 5 6 7 8 |
public String getSDKVersionCode(){ if(this.developInfo == null || !this.developInfo.contains("U8_SDK_VERSION_CODE")){ return ""; } return this.developInfo.getString("U8_SDK_VERSION_CODE"); } |
这样,我们就能在抽象层中,获取到当前渠道SDK的版本号了,然后在渠道SDK登录成功,接着向U8Server进行登录认证的时候,可以把这个versionCode传过去,u8server根据该versionCode区分当前使用的渠道SDK版本。如果你的u8sdk里有com.u8.sdk.verify.U8Verify这个类,那么在这里加一个参数即可:
1 2 3 4 5 6 7 |
Map<String, String> params = new HashMap<String, String>(); params.put("appID", U8SDK.getInstance().getAppID()+""); params.put("channelID", result.getChannel()); params.put("sid", result.getSid()); params.put("extension", result.getExpansion()); params.put("sdkVersionCode", U8SDK.getInstance().getSDKVersionCode()); |
PS:sdkVersionCode不参与md5签名。OK,到这里,我们的基础工作就算完成了。后面我们会详细讲解如何来实现渠道SDK的动态更新
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1817