精华内容
下载资源
问答
  • 聚合SDK开发思想

    千次阅读 2017-11-29 19:35:55
    搞了一段时间的聚合SDK,对于APK的反编译也有了一定的了解,希望写下来做个记录也可以帮助到和我遇到同样问题的同学,后面会详细介绍如何做聚合sdk的开发和打包流程,以及打包中遇到的各种问题和解决,这是我的第一篇...

    搞了一段时间的聚合SDK,对于APK的反编译也有了一定的了解,希望写下来做个记录也可以帮助到和我遇到同样问题的同学,后面会详细介绍如何做聚合sdk的开发和打包流程,以及打包中遇到的各种问题和解决,这是我的第一篇博客希望大家多多支持,谢谢!

    所谓聚合其实就是把各个渠道同功能的接口统一为一个接口,例如ysdk的登录接口为YSDKApi.login(ePlatform.QQ);
    联想的登录接口为LenovoGameApi.doAutoLogin();要把这两个接口统一那就得有一个基类接口,我们暂且给这个接口
    定义为doLogin(),那游戏方接入sdk时只需要调用我们的doLogin()接口即可

    有同学可能就会疑问,游戏调用我们的doLogin(),那我们怎么区分调用那个渠道的接口呢?这就得慢慢道来了

    首先每一个渠道就是一个module,我们给每一个module定义一个同名的类,记得是同名的类,sdk所有的方法都是通过该类调用,当我们打包渠道的时候就会把同名的类覆盖掉,这样当游戏调用登录时就可以渠道的登录了,既然是覆盖,那
    就得有个模拟的渠道,一是游戏接入我们的聚合sdk运行不会出错,二是为了方便游戏接入功能的检测。

    聚合sdk的基类其实就是起到一个转化的作用,而后每个渠道都是一个module,每个module都有一个同名的类,游戏的调用就是通过该类调用渠道sdk方法,再通过打包工具把渠道的资源和相应的类替换掉,这就是聚合sdk的开发流程。

    登录流程图:

    登录流程

    1. 游戏调用聚合sdk登录接口
    2. 聚合调用相应的渠道登录接口,调起登录界面登录
    3. 渠道sdk去渠道服务器获取用户信息
    4. 渠道服务器把用户信息返回给渠道SDK
    5. 渠道sdk把信息回调给聚合SDK
    6. 聚合SDK去服务器获取用户信息(因为每一个渠道返回的信息各不相同,需要在聚合后台注册用户统一信息,同时做各 种统计和支付检验,等等等。。。所以不能直接把渠道返回的信息直接返回给游戏)
    7. 聚合服务器把用户信息返回
    8. 把数据回传给游戏

    支付流程图:
    这里写图片描述

    1. 游戏方把订单信息发送给聚合sdk
    2. 聚合SDK去聚合服务器获取订单信息
    3. 服务器回传订单信息给聚合sdk
    4. 聚合sdk再去渠道sdk生成订单
    5. 渠道SDK去渠道服务器生成订单
      6.渠道服务器把订单信息回调给渠道SDK
      7.渠道SDK把支付结果回调给聚合SDK
    6. 聚合SDK把支付结果告诉游戏

    支付的验证是通过渠道SDK服务器回调聚合SDK服务器,聚合SDK服务回调给游戏服务器的,游戏校验订单的真实性进行发货

    展开全文
  • 前言 在安卓游戏SDK这个技术领域呆...在手游行业里,聚合SDK就是一个中间层,可以理解为连接游戏和渠道SDK交互的桥梁。举个例子说明一下印象会更深刻,我们都会去买火车票,买火车票不一定在火车站买,去12306官方网站

    前言

    在安卓游戏SDK这个技术领域呆了已经有4年多,从游戏发行中的一员逐渐转为游戏研发中的一员。从开始什么都不懂的菜鸟,摸爬滚打了几年,多多少少对这个行业以及技术领域有了相对成熟的理解。本文纯概念性的东西较多,其主要是为了记录一下这几年知识,分享给有需要的人。也让大家对这个游戏SDK行业,有一个基本的理解。

    1. 聚合SDK的概念

    在手游行业里,聚合SDK就是一个中间层,可以理解为连接游戏和渠道SDK交互的桥梁。举个例子说明一下印象会更深刻,我们都会去买火车票,买火车票不一定在火车站买,去12306官方网站购买或者电话订票 ,也可以去代售点购买,中国13亿人口可不是每个人都会网络或者手机订票 ,还是有部分人选择火车票代售点去买票。 铁路局官网就好比是游戏研发方,火车票代售点就好比游戏发行方(提供聚合SDK),铁路局授权给火车票代售点,代售点需要给官方授权费,代售点可以提供相关服务从购票者中获取相关利益。换个技术角度来看代售点就是一个很好的代理模式。

    1.1 游戏研发

    游戏研发方就是专门开发游戏的公司,我们称之为CP。一般游戏研发,很少会自己去推广、运营自己的游戏,术业有专攻,重点还是开发游戏为主。

    1.2 游戏发行

    游戏发行方负责游戏推广,运营以及相关技术服务,发行方手里有资源,这种资源来自哪里呢?其中来自两个点,第一点自身平台的用户量(资源),第二点是渠道或者平台方,例如华为渠道,华为渠道的用户量不用我说大家就应该知道。

    研发方有游戏,手里没有很多资源 。发行方有丰富资源,没有游戏团队来开发游戏。互补一下商量如何共赢合作一起赚钱呗,由发行方提供一套手游聚合SDK,其中包含核心的登录 支付等功能,研发方需要按照文档定的标准,只要接入发行方的聚合SDK,剩下的什么都不用管了。发行方要做的就是把融合完成的游戏包上传到各大游戏应用商店和自己的官方平台即可,发行方和研发方就可以坐等对账分成咯。

    1.3 渠道SDK

    上面提到过资源,用户量这一个概念,一个游戏想要赚钱就需要一个庞大的用户量,玩的人数越多游戏越吸引人意味着付费率会很高。平台上线了游戏之后,依赖用户自己来下载游戏,起量是很慢的,所以需要推广,如果使用推送让用户去下载,那么用户体验会很差。所以需要让那些有影响力的人来做有偿推广。例如华为游戏商店 、 oppo游戏商店 、vivo游戏商店等 硬核联盟。这样的渠道有着大量的用户,所以我们为了赚钱要把游戏上架到各大游戏商店,让渠道平台的大量用户去玩。

    1.3.1 游戏渠道SDK

    上架游戏商店之前,我们需要在游戏中接入对应联运SDK 。Huawei、OPPO 、ViVO等联运sdk是对应自己的平台,其中就包含最核心的2个体系 登录和支付。

    要上架我们渠道平台,我们给你做推广 ,让大量的用户上我的平台来玩你的游戏。这就相当于你上我家来做客,就要按我们的规矩来,就需要使用我们提供的服务(渠道sdk API)。

    当然了使用渠道的服务也是需要与渠道进行资金的分成,一般情况下总收入的50%是划到 渠道平台的,剩下 50%是发行和研发来进行分成。(特殊平台例如腾讯 划分比例会高一些)

    1.3.2 官方渠道SDK

    上游戏渠道要和平台进行比例分成,那么上自己的游戏平台收益就是百分百的完全不用跟别人分成总收入。官方渠道SDK是代表着自身的发行平台,做发行的一般都会有属于自己渠道平台SDK,自己平台即可以封装好给别人用,也可以接入到聚合SDK 中使用。

    官方SDK 本质上跟渠道SDK没什么区别,自身也是一个渠道SDK,拥有核心登录和支付一系列API。它可以打成aar包接入到聚合SDK中 ,也可以作为一个独立的渠道SDK 对外给别人使用。

    1.4 聚合SDK是什么?

    上述给大家说了一些概念和名词,可能有些朋友还是不好理解聚合sdk。那么我们一步步去分析讲解。先抛弃聚合SDK的概念,先看一下一个游戏是怎么直接去接入渠道联运SDK的,我之前写过博客Unity接入OPPO联运SDK这个大家可以去看看。

    图中为游戏直接接入OPPO网游SDK的登录的逻辑,逻辑图中数字对应下列的描述数字

    接入sdk逻辑图.png

    1. 游戏客户端调用SDK客户端登录API,如果满足登录条件的话,SDK客户端携带数据去请求SDK服务器端进行接口验证。

    2. 到第二步了说明SDK服务器端登录验证通过,然后会向SDK客户端返回一些数据。

    3. 游戏客户端 通过SDK客户端的回调通知后得到数据,一般情况下我们只需要得到token(令牌)和ssoid(用户唯一标识)即可。

    4. 游戏客户端获取到token 和ssoid后 ,拿数据给游戏服务器端发起验证请求。

    5. 游戏服务器得到token 和ssoid后,去请求SDK服务器(SDK服务器会有一份文档对外提供,正常情况下是一个登录请求的URL,游戏服务器按照要求进行拼串加密请求即可)

    6. 到这一步说明SDK服务器的登录二次验证是没问题的,SDK服务器校验的结果传回给游戏服务器

    7. 游戏客户端收到了游戏服务端的成功结果,就可以进行游戏的操作。


    上述7个步骤清晰的解释了游戏直接和渠道SDK交互的逻辑,文章开头介绍过游戏研发重点是放在游戏开发以及功能实现上,虽然游戏研发可以直接接入SDK渠道,但是考虑到一个问题,游戏需要推广和运营,游戏研发不擅长这些。国内的SDK渠道多如牛毛大大小小150个渠道应该是有了,要是150个渠道都接入一遍想想就酸爽, 而且渠道SDK还需要不定时更新,这无疑占用研发的大量时间精力。那么有没有针对游戏研发方一个更好的方案呢?游戏方只需要接入一个SDK 就可以完成N个游戏渠道SDK的上架呢 ,答案 有的 ,聚合SDK就这样诞生了。


    聚合SDK是连接渠道SDK和游戏方的一个桥梁或者说是中间层, 何解呢? 首先聚合SDK要和游戏渠道SDK进行交互,按照渠道SDK的文档要求进行接入,渠道SDK N多个他们的api 都是大同小异区别不是很大,那么把SDK共同点都抽象出来加以扩展(对内包容所有渠道SDK对外统一接口和回调),整合成一套完善的聚合框架提供给游戏研发方。研发方只需要接入一套聚合SDK就完活,剩下什么都不需要管可以安安心心去忙游戏相关的工作。由发行方进行游戏的打包分包上架游戏商店。


    下图很好的体现出聚合SDK,作为聚合只有一个,需要兼容接入多家游戏(为了多赚钱不可能只跟一家研发方合作),多家渠道(上架越多意味着收入会更多一些)

    聚合SDK.png

    聚合SDK是连接游戏研发与渠道SDK的桥梁,让他们可以通话,但是通话内容是经过聚合层加密的,也就达到了发行公司代理发行运营的目的。可以让你们通话,但不让你们直接见面,再通俗的说,聚合==中间商。下图是加入聚合SDK的统一登录流程,就是在原来研发直接接入渠道sdk基础上,多套了一层聚合客户端和聚合服务端而已。聚合支付流程和聚合登录流程差不多就不展示了。

    聚合SDK登录流程.jpg


    章节小结:

    手游聚合SDK 和普通的SDK(例如统计、定位)还是有很大区别的,最大的区别就是聚合SDK 需要提供一个统一的账号体系和支付体系,分别对应游戏登录和支付功能。

    2. 聚合SDK对外接口设计

    聚合SDK对外的设计就是一个抽象层,对每个游戏来说,只需要接入抽象层足以,而对每个渠道SDK的接入,就是抽象层的具体的实现。

    考虑到一些渠道SDK 有的API(例如退出游戏)会没有,建议通过反射来判断当前是否支持该方法,例如isSupportFunction(“exitSDK”) 如果返回false ,说明当前渠道不支持退出功能,CP需要处理游戏自身的退出游戏方法。

        /**
    	 *判断是否支持对应方法
    	 * @param function
    	 * @return
    	 */
        public boolean isSupportFunction(String function) {
    		Method method = null;
    		try {
    			method = getClass().getMethod(function, Map.class);
    			return true;
    		} catch (NoSuchMethodException e) {
    			try {
    				method = getClass().getMethod(function);
    				return true;
    			} catch (NoSuchMethodException e1) {
    
    			}
    		}
    		return method != null;
    	}
    
    1. 初始化

      • Application初始化:
        优秀的SDK会考虑到兼容性,设计聚合SDK的时候要多给别人选择性,考虑到游戏有application逻辑的,和没有application逻辑,聚合SDK都要做处理。

      • Activity的初始化

    2. 登录
      统一登录验证接口,聚合客户端接收渠道回调回来的参数,去聚合服务器校验。聚合客户端会提供给cp 登录成功 、登录失败 、登录取消三个回调状态,聚合服务器校验成功 cp会得到token 和uid 等信息,格式为json

    3. 支付
      统一支付验证接口,跟登录差不多 不做描述。备注下:订单号不要过长不能超过30个字符

    4. 注销(切换账号)

    5. 退出

    6. 生命周期
      设计的时候生命周期最好都要考虑全

       @Override
          protected void onStart() {
              super.onStart();     
          }
      
          @Override
          public void onResume() {
              super.onResume();
          }
      
          @Override
          public void onRestart() {
              super.onRestart();
          }
      
          @Override
          public void onPause() {
              super.onPause();
          }
      
          @Override
          public void onStop() {
              super.onStop();
          }
      
          @Override
          public void onDestroy() {
              super.onDestroy();
          }
      
          @Override
          public void onConfigurationChanged(Configuration newConfig) {
              super.onConfigurationChanged(newConfig);
          }
      
          @Override
          public void onNewIntent(Intent intent) {
              super.onNewIntent(intent);
          }
          @Override
          public   void  onRequestPermissionsResult(int requestCode, String[] permissions,  int[] grantResults){
              super.onRequestPermissionsResult(requestCode,permissions,grantResults);
          }
      
          @Override
          public void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
          }
      
          @Override
          public void onWindowFocusChanged(boolean hasFocus) {
              super.onWindowFocusChanged(hasFocus);
          }
      
    7. 渠道数据上报
      正常情况下集合中的value值是从游戏哪里获取真实数据 ,传输格式json。文中代码仅供演示

              private static Map<String, String> mRoleInfo = null;
      
              mRoleInfo = new HashMap<String, String>();
              mRoleInfo.put("roleId", "123456");// 当前登录的玩家角色ID,若无,可传入userid
              mRoleInfo.put("roleName", "角色名称");// 当前登录的玩家角色名,不能空
              mRoleInfo.put("roleLevel", "10");// 当前登录的玩家角色等级,不能为空,必须为数字,且不能为null,若无,传入0
              mRoleInfo.put("serverId", "1");// 当前登录的游戏区服ID,不能为空,必须为数字,若无,传入0
              mRoleInfo.put("serverName", "服务器名称");// 当前登录的游戏区服名称,不能为空,长度不超过50,不能为null,若无,传入“无”
              mRoleInfo.put("vip", "vip20");// 玩家VIP等级   若无,传入0
              mRoleInfo.put("moneyNum", "100金币");// 当前玩家身上拥有的游戏币数量  若无,传入“无”
              mRoleInfo.put("roleLevelUpTime", System.currentTimeMillis() / 1000 + "");// 角色等级变化时间,仅创建角色时传入,同一角色创建时间不可变(单 位:秒 ),长度 10
              mRoleInfo.put("roleCTimeroleCTime", System.currentTimeMillis() / 1000 + "");// 角色创建时间,仅创建角色时传入,同一角色创建时间不可变(单 位:秒 ),长度 10
      
    • 选择区服

    • 创建角色

    • 选择角色

    • 进入游戏

    • 角色升级时

    • 退出游戏

      对应场景(这些场景满足国内大部分SDK)接收游戏传来的数据 上报给渠道SDK,这个一般渠道SDK做统计用

    1. 实名认证

      2020年新增的一个接口 ,SDK渠道为了响应国家号召,所以聚合也需要提供接口给CP


    3.聚合SDK开发规范

    开发一套聚合SDK,会提供给多个CP去使用,我们无法保证CP开发的游戏,是否有接入其他的SDK,或者自身使用到了第三方的SDK。所以我们在开发SDK时候要注意以下几点。

    1. 依赖第三方库导致的冲突
      说明:作为聚合SDK,应该尽量少使用开源库,或者说不用开源库,而是通过手写网络框架,手写数据库等等,主要是考虑两个方面:

      • 减小SDK体积 ;

      • 避免渠道和CP接入的时候发生依赖冲突

      曾经遇到过这样的场景 渠道用了低版本的v4包 ,游戏给的母包(接入好聚合sdk的游戏包apk)用了高版本的 v4包 。导致一个问题拆包合并覆盖资源时候smali文件丢失,重新生成的渠道包 各种崩溃闪退。简述一下这个问题最后解决方案 就是删除掉渠道低版本v4包采用高版本的。v4向下兼容

      规范:应该尽可能地避免依赖过多的第三方库。特别是一些知名的库,比如android support库,okhttp3, glide, eventbus等等。 如果你确实要使用,也可以使用工具将这些开源库的包名改为您自定义的名称。

    2. 聚合SDK中的资源文件命名冲突

      说明:聚合SDK中可能会引用的布局资源,如果与CP或者渠道SDK资源重名会很麻烦。资源重名冲突的问题一般会出现在偏门或者小众的sdk上。比较出名大众SDK都会对资源命名有严格要求。举个例子sdk中有layout_main.xml, 游戏母包或者渠道SDK中也带有同名的layout_main.xml。在解包合并资源时候就会出现资源丢失奔溃的问题。这也是为什么强调资源命名一定区分开。

      规范:资源等命名,需要加上自己独特的前缀,避免与CP或渠道SDK冲突。例如
      baidu_layout.xml,baidu_dimen.xml.资源id的命名同样如此。一定要规范,不然会有很多麻烦。

    3. 聚合SDK中的所使用资源索引(R.java)直接引用,会导致接入游戏中,资源引用丢失或崩溃等情况

      规范: 所有对res文件下资源的引用,代码统一使用context.getResources().getIdentifier() 动态方式获取资源id

      技术博客:Android动态获取资源ID之getIdentifier()

    4. 聚合SDK对外接入文档规范

      说明:考虑到CP可能是国内的研发团队 也可能是歪果仁,所以文档要提供两份 一份国内简体中文版 和国外英文版两套文档。文档内容一定要简单明了,不要做过多赘述,层次要清晰,文档内容涉及的专业术语要写的官方些。常见的SDK问题和聚合SDK架构逻辑要描述清楚,这样能减少不必要的沟通成本。

      文档规范:

      • 聚合SDK文档概要说明

      • 更新日志

      • 快速升级

      • 接入准备与环境配置

      • 聚合SDK架构逻辑图

      • SDK接口(每个接口都要标注好必接和选接)

      • SDK接入常见问题

    4.聚合SDK常见的一些问题,以及解决方案

    • HTTP和HTTPS
      Android9.0 默认是禁止所有的http请求的,作为聚合SDK是需要兼容做下兼容的。避免游戏工程或者渠道SDK使用HTTP导致崩溃出现。我列出两种方案,供大家参考。

      1. 在建立res/xml/network_security_config.xml,

          <?xml version="1.0" encoding="utf-8"?>
          <network-security-config>
              <base-config cleartextTrafficPermitted="true" />
              <domain-config cleartextTrafficPermitted="true">
                    <domain includeSubdomains="true">gamecfg-mob.ubi.com</domain>
              </domain-config>
          </network-security-config>
        

        在清单文件的application中添加android:networkSecurityConfig="@xml/network_security_config"

      2. 在清单文件的application中添加 属性 android:usesCleartextTraffic=“true” (这种方式比较省事)

    • Java版本管理

        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
       }
      
      

      主要为了兼容,这种设置国内渠道SDK很少 ,海外的SDK比较多

    • 权限问题
      关于权限问题,聚合SDK可以做成工具类或者做成一个权限库对CP开放接口。可能CP也会对权限做处理,如果同时获取,在玩家还没给权限的情况下,有些手机是会重复弹出权限询问框的,所以这个权限问题最好是让CP控制。

    • 支付补单逻辑
      无论是聚合客户端还是聚合服务端,都有自动补单的能力,聚合服务器一定要完善,对新的补单请求要做及时处理。聚合客户端也要做好本地数据的存储以及定时的清除补单数据,在初始化或者支付前校验一下是否有调单的订单。针对调单的问题大部分是单机游戏 。网络游戏正常情况下CP方会有调单处理的逻辑。但也并非绝对。

    • Android Studio 与Eclipse
      考虑到CP特殊性,会提供AS和Eclipse两种DEMO工程,对于海外的一些CP,部分还是有用Eclipse做接入的。正常情况下提供aar文件,eclipse是不支持aar文件的,但是可以把aar文件拆分下,aar本质上也是个压缩包。

    • 方法超限的问题
      方法超限问题在国内的SDK比较常见的 例如接入百度和奇虎360的网游联运SDK,考虑到这种情况,在设计聚合SDK的时候,在application里会处理对应的逻辑。在跟CP对接时候文档一定要明确 版本避免与CP和渠道方的冲突。关于MultiDex的用法可参考我写过的文章:MultiDex使用和原理解析

    • 部分高版本机型 出现底部栏黑边情况
      在清单文件中application属性里设置android:resizeableActivity = “true”并加上
      属性,
      这俩属性配套使用。如果还会不行在Activity的onCreate()里调用此方法。

        private void SetScreen() {
            Window window = getWindow();
            //使内容出现在status bar后边,如果要使用全屏的话再加上View.SYSTEM_UI_FLAG_FULLSCREEN
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                Log.i("VERSION_CODES", "Build.VERSION_CODES.JELLY_BEAN");
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            }
            //设置页面全屏显示
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                Log.i("VERSION_CODES", "Build.VERSION_CODES.P");
                WindowManager.LayoutParams lp = window.getAttributes();
                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                //设置页面延伸到刘海区显示
                window.setAttributes(lp);
            }
        }
      
      
    • 关于异形屏的问题
      异形屏是最近这一两年出来的,每个手机厂商平台提供对应的异形屏适配的文档,我们可以根据文档提供的方式封装成工具类, 对外供CP调用。这里我就不做展示了很简单。

    • 部分机型广告SDK问题
      聚合SDK根据需求封装过广告的插件 ,一些特殊的渠道广告SDK ,例如OPPO和VIVO的广告SDK,只能在OPPO和VIVO手机上才能做广告展示。很坑,这个我觉得需要记录一下。

    结语

    本人表述能力有限,大家多多谅解,希望这篇文章能带给你一些帮助,如果还是没有理解欢迎私信骚扰我。

    展开全文
  • 作为一个聚合sdk的客户端,势必针对每一个不同渠道sdk有一套自己的配置文件。同时,作为聚合sdk客户端本身也会有相关的功能配置需求。加上部分的游戏开服和登录等等在线应急功能的需求,也最好是需要有一套配置文件...

    作为一个聚合sdk的客户端,势必针对每一个不同渠道sdk有一套自己的配置文件。同时,作为聚合sdk客户端本身也会有相关的功能配置需求。加上部分的游戏开服和登录等等在线应急功能的需求,也最好是需要有一套配置文件。同时这些配置文件有些需要放在本地,有些则需要放在资源服上读取,有些则要放在聚合sdk服务器上读取。
    零零总总的说了这么多,那么让我们来理一下思路,看看到底要有那些配置文件。
      从功能分类来说
        1. 针对单个渠道sdk的相关配置
        2. 针对聚合sdk额外功能的相关配置
      从读取难易来说
        1. 放在本地的配置(读取速度快且必定成功,但是有被修改风险,很难做更新)
        2. 放在服务器的配置(读取成功存在失败因素,几乎没有被修改风险,很容易做更新)
        3. 写在代码里文件的配置(读取速度快,被修改难度大,但是很难做更新)

    鉴于上述的这些分析,那么我们做了以下的这些规划
      1. 存放本地的配置的文件:localConfig
    其中包含了以下几点内容:
        a. 单个渠道sdk的非关键性配置:例如appid,渠道编号,等
        b. 单个游戏包的sdk额外功能;是否加载广告检测,是否使用热更新等

      2. 存放在服务器的配置文件:serverConfig
    其中包含了以下几点内容
        a. 渠道的回调地址,appkey等关键性参数
        b. 游戏登录的白名单列表等
        c. 游戏log的是否开启
        d. 游戏的sdk辅助功能是否开启使用的开关等
      3. 写在代码文件里的配置:codeConfig
    其中包含了以下几点内容
        a. 从服务器读取文件的下载地址列表,需要有多个下载地址
        b. 解析本地配置文件的相关算法(本地配置文件可能加密)
        c. 其他和sdk聚合服通信的地址和接口。

    接下来我们来说说,这三类配置文件分别在什么时候读取和使用。

    存放本地的配置的文件
      这种建议直接在游戏启动时读取,因为从本地文件转换成内存中的数据,仍然是需要一个输入/输出流的操作,存在异常的捕获和处理。
    本地配置文件应该在sdk功能正式启用前就被加载,换言之,在sdk的初始化之前,需要将本地配置文件读取出来并且存到内存中。在接下来的sdk初始化过程中,将会用到本地配置文件的appid这些渠道sdk配置参数。

    存放在服务器的配置文件
    这些数据建议先在每个具体的逻辑接口调用前读取一次。这些配置文件中的数据,有以下这些的相关设计
      a. 这些数据本身需要有一个默认值,防止在网络不好的情况下无数据可用,造成逻辑上的卡死。
      b. 这些数据每次使用的时候,都需要刷新重新读取一遍,因为这些数据存在的最大用处就是动态的后台更新相关配置
      c. 这些数据每次读取到以后,都需要缓存进内存中。如果下次从服务器没有读到相关配置,则使用缓存在内存中的数据
      d. 这些数据需要在获取到/超时后再调用后面的逻辑,不要做异步的接口调用。

    写在代码文件里的配置:codeConfig
    这些配置文件因为是写在代码中的,所以不需要缓存进内存中,它们本身应该是静态常量,可以每次需要使用的时候,直接读取就行。

    接下来特地说下有关代码里的配置:coneConfig
    因为移动设备本身固有问题,之前做项目的时候,有遇到过ip地址解析不了的情况,所以在读取相关的服务器配置地址时候,我们做了以下的相关设置
      a. 配置文件最好有域名的配置。
      b. 同一个接口,有多套的备选地址,以防有一台服务器无法访问到,而造成逻辑上的中断
      c. 本身要有相关的超时机制,当第一个ip访问不到时,才开始访问第二个,并且所有接口应该都遵循这套逻辑


    有关配置文件的数据格式,这里我们提及一些项目中遇到的实际情况
    我们当初使用的数据格式是json,而在http协议中,”:\”这两个符号是不能使用的,必须进行URLEncode,在服务端和客户端通信中,这个小问题常常被忽视。
    有关配置文件的一些设计思路,我们就先暂时讲到这里。同时也欢迎广大看客联系我们typesdk的技术,提出宝贵的意见和建议。

     

    这个项目已开源,大家有兴趣可以自己研究或者参照项目编写自己的聚合SDK
    项目地址:https://code.csdn.net/typesdk_code
    项目地址:https://github.com/typesdk

    展开全文
  • 引言:本文旨在提供读者制作一个自己的聚合sdk的思路,抛砖引玉,让更多的读者对聚合sdk有好的理解。  在上一篇《TypeSDK总体思路和架构》中,简述了一个聚合sdk,需要哪些模块,实现哪些功能,模块之间的相互关系...

    引言:本文旨在提供读者制作一个自己的聚合sdk的思路,抛砖引玉,让更多的读者对聚合sdk有好的理解。

           在上一篇《TypeSDK总体思路和架构》中,简述了一个聚合sdk,需要哪些模块,实现哪些功能,模块之间的相互关系是怎么样的。

           有了基本思路和架构,那么任何一个程序一个解决方案,都会有一个基本的设计原则。作为聚合sdk,我们要秉承哪些基本原则呢。

           1.和游戏项目的低耦合性

           2.聚合sdk具有易用性

           3.具有较强的拓展性

          

           1.先来探讨怎么去做低耦合性。

           作为聚合sdk,最直接需要面对的问题就是跨平台问题。我们要先有一个概念,那就是游戏的开发平台以及游戏的发型平台是完全不同的。游戏的开发平台,是指游戏用什么语言,在什么样的生产环境开发。游戏的发行平台,指的是游戏在什么样的终端上运行。

           移动游戏主要的发布平台是iOS、安卓两大平台,windows phone占有量太小,国内几乎没有发行渠道。

           游戏主流开发平台包括了unity、cocos2dx。而使用原生安卓和ios用来开发软件的相对多。鉴于以上这些我们将原生Android和ios作为发布基础,并正对unity和cocos2dx提供开发封装。

           实现的逻辑关系如下:

     

     

    1.  作为游戏的开发者,在游戏客户端层面,只需要关注开发平台的sdk接口调用逻辑,而不用关心sdk接口的实现逻辑。Sdk接口的申明,由typesdk提供的typesdkclient部分给出

    2.  作为聚合sdk接入层,接入各大渠道自己的sdk代码实现部分,即各大发布平台的实现层,只需要在typesdk的框架下,实现各个逻辑接口的功能,而不用关心具体是谁去调用,是怎么调用的。

    3.  而开发平台的接口申明,发布平台的统一接口的规范,这一整套,就是聚合sdk客户端部分的主要框架。

    4.  接口的调用,和接口的实现完全的分离,实现了游戏逻辑代码和渠道sdk的解耦。整个聚合sdk体系相互独立,又相互有关,使得整体的功能实现,可以达到模块化,功能化,区分话的目的。让整个项目可以由多人共同开发,大大提高开发进度。

          

           2.如何做聚合sdk具有易用性

           人们都爱和简单的人相处,人们也爱使用简易容易上手的东西。iphone的成功,其中有一点那就是其外观的简洁,其系统的易于理解。

    聚合SDK使用对象有两类,1.

           说到简单,不得不提及一个和简单有关的词,统一,凡事简单的事物,都能让用户很快的形成统一的使用习惯。那么从代码设计上来说,统一中最具有代表性的就是,程序中的单例模式。

           我们设计一个单利的类(TypeSDKClass),让用户的一切接口调用,回调函数接收,事件处理等等事物,都从这一个入口出发,也只从这一个入口导出,其内部结构无论如何复杂,用户不需要关心。他们只要记得,我想做一件事,我找到那个单例TypeSDKClass 从他提供的方法和需要实现的回调中,都能满足我的需求就行。

           并且,这个单例对象TypeSDKClass 不需要关心他如何创建,如何销毁,只需要我想用的时候,随时随地能用。

           有了单例对象为主体,在程序设计中,不可避免的是数据传递。

           最易用的易懂的数据结构,hashmap类应该算其中之一。我们程序提供接口中传递的参数,使用的数据结构是一个经过包装过的hashmap,有一套容易理解的通过key来存取对应的value值。

           用户并不需要关心这个数据结构在跨平台传递时候是如何工作的,只需要在使用的时候感觉容易理解,容易使用。

     

           3.我们来说说拓展性

           各大渠道的sdk都是发展的,各大发行平台同样也是在不断发展的,安卓从2.0已经成了现在的7.1,ios保持着一年一个大版本的稳定节奏,新老版本的更替,部分老的接口被弃用,部分新的接口被启用。更多的情况是,有了新的功能,来提升游戏的体验性和功能性。

           作为我们的聚合sdk,要能保持与时俱进,才能不断绽放新的生命活力。而与时俱进最好的办法就是具有很强大的拓展性。

           我们在游戏的发布平台,需要设计一个接口,该接口可以通过函数名来调用指定的函数,而该函数的参数,也需要是string类型。这样一来有几个优势。

           1.函数名是string类型,接入聚合sdk的cp并不需要重新的更新开发平台(unity或者coco2dx)的聚合sdk部分,只需要新增几个string字段就能调用函数

           2.参数是string类型,那就是可以把我们之前的hashmap类型数据转成string类型的json,既有了通用型,也不乏丰富性。

           3.通过string类型函数名来执行函数,哪怕该函数不存在(例如运行设备版本过低,并不支持该功能),我们可以在发布平台层面,做相应的逻辑处理,而不会造成游戏的崩溃。

           4.不论以后会有多少新的功能出现,我们做到了以不变应万变。一招鲜吃遍天。我们只需要不断的在运行平台的实现接口层面不断的新增新功能接口的实现,就可以做到,在游戏客户端部分,随时随地的使用到我们支持的新功能。

          

           以上这些是博主对一套聚合sdk设计中,需要秉承的一些原则的看法,当然肯定还有其他的原则,比如代码规范中的hasmap数据结构类型的key值是string类型,而string类型的内容,要有统一的命名规则,这样可以避免因为书写的错误,造成数据操作的bug。

           博主抛砖引玉,希望更多的读者不吝言辞,可以提出你们的看法和建议。

           在下一篇,我们会主要讲解发行平台层面(安卓和ios)的聚合sdk实现详细思路和结构。让大家都能对聚合sdk有自己的看法和理解,最终能做出属于你自己的聚合sdk。

    这个项目已开源,大家有兴趣可以自己研究或者参照项目编写自己的聚合SDK
    项目地址:https://code.csdn.net/typesdk_code
    项目地址:https://github.com/typesdk

           

    展开全文
  • 引言:本文旨在提供读者制作一个自己的聚合sdk的思路,抛砖引玉,让更多的读者对聚合sdk有更好的理解。    手游渠道成百上千,相对的渠道sdk需求更是千七百怪。聚合sdk的基础框架包含了手游渠道通用的大...
  • 官方地址:TJHello/ADEasy ADEasy-自动集成说明 QQ交流群(425219113) 使用该程序之前,请仔细阅读:《免责声明与许可协议》 一套全平台的广告聚合SDK快速集成框架。 简介: 自动化集成技术,只需要简单控制平台开关...
  • 在上一篇《TypeSDK聚合sdk设计基本原则》中我们提到了,设计聚合sdk需要设计开发平台部分的接口,以及设计发布平台的聚合这2个大模块。那么我们今天就先来讲讲发布平台之一:安卓平台的统一化接口结构和思路。 一...
  • 在前一篇文中,我们对一个聚合SDK服务端所需要实现的功能作了简单的分析。通过两个主要场景的功能流程图,我们可以看到,作为多款游戏要适配多个渠道的统一请求转发中心,TYPESDK服务端主要需要实现的功能有以下几个...
  • 在之前的几篇文字中,我们分析了从零开始搭建一个渠道聚合SDK服务端所需要应对的几个最重要的一般性流程。按照文中的内容,我们大可以自己最擅长的语言和工具开发出一套已经可以正常工作的服务端,这个服务端可以...
  • 经过前两篇文字的分析与设计,我们已经可以搭建出一个能够支持多游戏多渠道的聚合SDK服务端,但这只是理想化状态下的一个简化模型。如果接入渠道的逻辑都是按照理想化的简化过程来构建,那么对于支付的请求,我们...
  •  作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各种渠道的SDK。而且这些渠道接口的具体接入字段和接入逻辑,每个月以至...
  • 2.我们根据每一个渠道的sdk不同,单独创建每个渠道自己的实现类Bonjour_xx。  2.1 这个类继承通用的框架基类(BaseBonjour)。  2.2 在该框架下,实现基类所有的必需实现的抽象接口。如果没有该接口的...
  • 在上一篇《iOS平台接口设计及思路》中...这个项目已开源,大家有兴趣可以自己研究或者参照项目编写自己的聚合SDK 项目地址: https://code.csdn.net/typesdk_code 项目地址: https://github.com/typesdk
  • 在整个交互过程中,游戏服务端,SDK服务端,渠道服务端都属于安全区域,这部分发生的数据交互,基本是可以信任的,只需要作相对简单的处理工作;而客户端,包括游戏客户端,SDK客户端都属于危险区域,在这部分产生的...
  • 这个项目已开源,大家有兴趣可以自己研究或者参照项目编写自己的聚合SDK 项目地址: https://code.csdn.net/typesdk_code 项目地址: https://github.com/typesdk 转载于:...
  • SDK:支付SDK和依赖库。直接将这个文件夹拖入工程即可。 目录介绍: Channels:第三方平台的SDK,包含支付宝、微信 MOBPaySDK:支付SDK主库 Required:必要依赖库 三、集成支付SDK 1、将SDK添加到项目里 (1)手动将SDK...
  • 聚合支付也称“融合支付”,是指只从事“支付、结算、清算”服务之外的“支付服务”,依托银行、非银机构或清算组织,借助银行、非银机构或清算组织的支付通道与清结算能力,利用自身的技术与服务集成能力,将一个...
  • WeDPR是微众银行区块链围绕数据隐私保护核心业务场景,打造的一套即时可用、场景式隐私保护解决方案。秉持拥抱开放的理念,微众银行区块链持续开源WeDPR系列场景中的组件。开源以来,WeDP...
  • Cmpay_v20181220(测试版本)项目介绍Cmpay聚合支付 Cmpay草帽聚合支付使用ThinkPHP框架开发,已接入微信、支付宝等主流支付渠道。目前已经接入支付渠道:微信(扫码支付)、支付宝(电脑网站支付、手机网站支付);运行...
  • 腾讯云以Restful API V3代码方式将腾讯云SDK资源及开源插件资源全面开放 1、腾讯云以Restful API V3代码方式将腾讯云SDK资源全面开放 2、第三方开源应用及开源插件 本博客关联: 喜欢的话,就在下面点个赞、收藏...
  • Toponad 一个新的flutter插件项目。 入门 该项目是Flutter的起点,Flutter是一个特殊的程序包,其中包括针对Android和/或iOS的平台特定的实现代码。 要获得Flutter入门方面的帮助,请查看我们的,其中提供了教程,...
  • SDK 包已经放到这里 riverslei/payment composer require "riverslei/payment:~3.0" 放入composer.json文件中 "require": { "riverslei/payment": "~3.0" } 方式二 直接下载安装,SDK 没有依赖其他第三方库,但需要...
  • 开源聚合支付系统SpringBoot版本 包含了支付宝 微信 银联等常规支付手段 可在任意项目中集成 简单方便 下载即可使用
  • 提供http形式接口,提供各语言的sdk实现,方便对接; 接口请求和响应数据采用签名机制,保证交易安全可靠; 系统安全,支持分布式部署,高并发; 管理端包括运营平台和商户系统; 管理平台操作界面简洁、易用; 平台...
  • 目前仅是一个开发工具包(即SDK),只提供简单Web实现,建议使用maven或gradle引用本项目即可使用本SDK提供的各种支付相关的功能 特性 1. 不依赖任何 mvc 框架,依赖极少:httpclient,fastjson,log4j,...
  • 在前一篇文中,我们对一个聚合SDK服务端所需要实现的功能作了简单的分析。通过两个主要场景的功能流程图,我们可以看到,作为多款游戏要适配多个渠道的统一请求转发中心,TYPESDK服务端主要需要实现的功能有以下几个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,751
精华内容 2,300
关键字:

聚合sdk开源