Android 手游聚合SDK小知识(一)

Android 手游聚合SDK小知识(一)
Android 手游聚合SDK小知识(二) 聚合分包

前言

回头想想,在安卓游戏SDK这个领域,我也呆了4年了,从啥都不懂的小菜鸟,逐渐靠自己不断学习,对这个行业也算有了一些理解,趁着最近有空,我想了一下,还是把最近这几年对游戏SDK聚合的一些理解分享出来给大家,希望能和大家一起进步。PS:目前我做的聚合SDK只能适用于国内,海外谷歌包用的是aab,并且海外渠道sdk资源引用时经常不使用反射,所以海外SDK目前我还没想出来如何聚合,希望有朋友能解决这个问题分享给我。

1、渠道SDK

一个游戏需要庞大的用户量,毕竟玩的人越多,越多人充值,老板就赚得越多,你的工资奖金才能越多嘛,这时候就需要接入一些第三方渠道,让他们帮你进行有偿推广,这些第三方渠道拥有大量用户,可以帮你进行迅速的起量,让大家都去玩你的游戏。

1.1、联运渠道SDK

我们可以接入一些联运SDK渠道,使用他们的渠道来帮我们推广游戏,百度、360、应用宝,Huawei、OPPO 等,包含了最核心的登陆、支付等体系。如果接入了这些渠道,就可以使用他们的SDK服务(登陆、支付等)。
当然了,使用这些联运渠道,一般情况下都是要与对方分成的,充值的时候吊起来的是对方的充值界面,先充到对方的账户上,再进行分成,一般来说分成比例从37开到19开不等。

1.2、自有SDK渠道

如同上面说的,联运SDK需要与渠道方分成,而且分成比例极高,这个时候如果老板自己有稳定的推广渠道,就可以使用自有的SDK,说白了,自有SDK和联运渠道SDK本质上没什么区别,也拥有登录、支付等一系列体系,只不过它属于发行公司内的的SDK,使用自有的SDK就可以100%收入归自己了,但是相应的,推广的成本也要自己掏,这里就不赘述了。
内部SDK可以封装在聚合SDK中,也可以单独写成一个moudle,我这里是单独写成了一个moudle,用的时候打包成aar,和聚合sdk一起给cp接入,cp接入后就可以吊起我们自有的SDK,完成登录支付等一系列操作,后续我再将包用脚本进行渠道分包。

2、游戏研发(CP)

游戏研发也就是专门开发游戏的公司,一般称为CP。

3、聚合SDK

在游戏行业中,聚合SDK可以理解为一个中间层,一个桥梁,作用是沟通游戏CP和渠道SDK。
聚合SDK = 聚合层接口 + 渠道SDK(或者是自有SDK)
使用聚合SDK,聚合层接口不变,变得是渠道SDK,可以在游戏接入一次聚合SDK后,用脚本自动反编译回编译,替换掉渠道SDK代码,实现一包多渠道,减少CP方的工作量。

图中是游戏未接入聚合SDK的情况下,调用登录逻辑。
在这里插入图片描述

  1. 游戏客户端调用SDK客户端的登录API进行登录,SDK客户端会拉起登录界面
  2. SDK客户端在登录界面输入账密或调用第三方登录
  3. SDK服务端校验登录信息成功,返回userID和token给SDK客户端
  4. SDK客户端通过回调将userID和token返回给游戏客户端
  5. 游戏客户端获取到token和userID后,将其传给游戏服务器端
  6. 游戏服务器将数据传给SDK服务器进行校验
  7. 校验通过,游戏服务器将用户的账户信息返回给游戏客户端
  8. 游戏客户端登录成功

上面的步骤解释了游戏和渠道SDK的交互逻辑,理论上CP是可以直接接入SDK渠道的,但是,目前有一个问题,那就是如果有多个SDK渠道怎么办,目前国内大大小小的渠道有上百个,如果要将这上百个渠道挨个接入,这里面的工作量想必巨大无比,需要占用游戏研发非常多的工作时间,那么有没有这么一种方法,游戏研发接入一遍就可以实现完成多个sdk渠道的上架呢,这时候,聚合SDK就应运而生了。
聚合SDK只有一个,游戏研发只用接入一个聚合SDK,然后剩下都交给聚合方,由聚合方进行分包上架。
下图是加入聚合SDK后的登录逻辑:
在这里插入图片描述

4、聚合SDK对外接口及注意事项

1、初始化
Application 的初始化,让CP使用或继承我们的Application,我们再继承渠道方的Application。
Activity中的init方法。
2、登录
统一登录接口,接收渠道方的登录回调参数,再将登录回调参数去聚合服务器校验,通过校验后,聚合服务器返回token和userID,聚合SDK再将参数传给游戏客户端,由游戏客户端和服务器完成登录校验。

    /*** 登录方法* @param activity  上下文环境*/public void login(Activity activity){Log.v(TAG,"进入登录");}

3、支付
4、注销(切换账号)
5、生命周期

   /*** onCreate生命周期方法* @param activity*/public void onCreate(Activity activity, Bundle savedInstanceState){Log.v(TAG,"进入onCreate");Log.v(TAG,"onCreate执行完成");}/*** onResume生命周期方法* @param activity    之前的塔防版署包这里是context*/public void onResume(Activity activity){Log.v(TAG,"进入onResume");Log.v(TAG,"onResume执行完成");}/*** onPause生命周期方法* @param activity   之前的塔防版署包这里是context*/public void onPause(Activity activity){Log.v(TAG,"进入onPause");Log.v(TAG,"onPause执行完成");}/*** onDestroy生命周期方法* @param context*/public void onDestroy(Context context){Log.v(TAG,"进入onDestroy");Log.v(TAG,"onDestroy执行完成");}/*** onRestart生命周期方法* @param context*/public void onRestart(Context context){Log.v(TAG,"进入onRestart");Log.v(TAG,"onRestart执行完成");}/*** onStart生命周期方法* @param context*/public void onStart(Context context){Log.v(TAG,"进入onStart");Log.v(TAG,"onStart执行完成");}/*** onStop生命周期方法* @param context*/public void onStop(Context context){Log.v(TAG,"进入onStop");Log.v(TAG,"onStop执行完成");}

6、退出

    /*** 退出游戏弹窗*/public void exitGame(Context context){}

7、数据上报

  1. 创建角色
  2. 角色升级
  3. 进入游戏
  4. 选择区服
    这些场景一般是接收游戏传递过来的数据上报到渠道或聚合sdk中,用于数据统计用
                Map map = new HashMap();map.put("uid", "123456");   //角色idmap.put("server_id", "310");  //区服idmap.put("server_name", "houruoyu333");  //区服名称map.put("role_id", "1225883");  //角色idmap.put("role_name ", "houruoyu");  //角色名称map.put("role_level", "3");   //角色等级map.put("game_name", "");   //游戏名称map.put("role_type", "战士");  //角色职业map.put("vip_level", "13");   //vip等级map.put("game_money", "999");   //玩家拥有金币数量map.put("create_role_time", Long.valueOf(1616136064));  //创角时间map.put("level_up_role_time", Long.valueOf(1616136064));  //升级时间map.put("has_gold", "3000");     //补充字段

8、实名认证接口

5、聚合SDK规范

1、尽量少使用第三方开源库,避免和cp引入的依赖发生冲突
2、命名规范
聚合SDK中可能会使用string、color、布局文件等资源,如果和cp或渠道sdk发生重名会很麻烦,会导致合并资源的时候发生冲突。所以一般来说,资源等命名,都需要加上自己独特的前缀,避免冲突,例如:

<string name="houruoyu_app_online">登录</string>

如果不加上 houruoyu_作为前缀的话,很容易冲突。
3、聚合SDK中使用资源索引(R.java),会导致合包的时候资源冲突,或者缺失资源等问题。
解决方法:所有涉及到R.java资源的引用,统一使用context.getResources().getIdentifier(“资源名”, “资源类型”, “包名”);
4、回调统一
建议在初始化处,统一做回调处理,例如:

    HouruoyuSDK.getInstance().init(this, new Callback(){@Overridepublic void onInitSuccess() {//初始化成功}@Overridepublic void onInitFailed() {//初始化失败}@Overridepublic void onLoginSuccess(User user) {//登录成功}@Overridepublic void onLoginFailed(String msg) {//登录失败}@Overridepublic void onLoginCancel() {//登录取消}@Overridepublic void exitGame() {//退出游戏}});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/117052.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Terraform学习】使用 Terraform创建Lambda函数启动EC2(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

Netty-ChannelPipeline

EventLoop可以说是 Netty 的调度中心&#xff0c;负责监听多种事件类型&#xff1a;I/O 事件、信号事件、定时事件等&#xff0c;然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 ChannelHandler 完成的&#xff0c;ChannelPipeline 和 ChannelHandler应用开发的过程…

专门针对开发人员,攻击者利用Rust获取操作系统信息

近日&#xff0c;研究人员在 Rust 编程语言的 crate 注册表中发现了一些恶意软件包&#xff0c;专门针对开发人员。 Phylum 在上周发布的一份报告中称&#xff0c;这些库是由一个名为 "amaperf "的用户在 2023 年 8 月 14 日至 16 日之间上传的。现已删除的软件包名…

【kubernetes系列】Calico原理及配置

概述 Calico是针对容器&#xff0c;虚拟机和基于主机的本机工作负载的开源网络和网络安全解决方案。 Calico支持广泛的平台&#xff0c;包括Kubernetes&#xff0c;OpenShift&#xff0c;Docker EE&#xff0c;OpenStack和裸机服务。 Calico在每个计算节点都利用Linux Kernel实…

改革企业治理结构,建立国有企业全面预算管理制度

随着我国市场经济的推广&#xff0c;国有企业进入到改革发展的必经之路上&#xff0c;企业应当结合自身实际情况加强成本管控&#xff0c;提高管理效率&#xff0c;为企业的发展提供有力保障。近年来&#xff0c;全面预算管理的理念在国有企业实施范围内不断扩大&#xff0c;加…

企业知识管理的解决方案

人们发现&#xff0c;挖掘知识、创造知识、生产知识&#xff0c;用知识为自己的产品赋予高附加值&#xff0c;才是企业和社会可持续发展的动力之源。所以知识管理越来越受到重视。 知识管理作为一个新兴的管理概念&#xff0c;已经被学术界所接受&#xff0c;但尚未形成一个…

python3+requests:接口自动化测试(二)

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;&#xff1a;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于…

Android OTA 相关工具(八) 使用 lpadd 添加镜像到 super.img

文章目录 1. lpadd 的编译2. lpadd 的帮助信息3. lpadd 的用法3.1 准备工作empty 的 super 设备镜像raw 格式的 super 设备镜像sparse 格式的 super 设备镜像 3.1 lpadd 分区操作示例 4. 其它 我一直以为没有人会使用 lpadd 工具&#xff0c;就像我以为没有人会去使用 lpmake 手…

Netty源码NioEventLoop解析

带着问题源码 Netty 的 NioEventLoop 是如何实现的&#xff1f;它为什么能够保证 Channel 的操作是线程安全的&#xff1f;Netty 如何解决 JDK epoll 空轮询 Bug&#xff1f;NioEventLoop 是如何实现无锁化的&#xff1f; 一、作用与设计原理 Netty的NioEventLoop并不是一个存…

无涯教程-Android - 应用组件

应用程序组件是Android应用程序的基本组成部分&#xff0c;这些组件需要在应用程序清单文件 AndroidManifest.xml 注册&#xff0c;该文件描述了应用程序的每个组件以及它们如何交互。 Android应用程序可以使用以下四个主要组件- Sr.NoComponents & 描述1 Activities 它们…

2023-9-2 Kruskal算法求最小生成树

题目链接&#xff1a;Kruskal算法求最小生成树 #include <iostream> #include <algorithm>using namespace std;const int N 200010;// 与并查集中的p含义相同 int p[N];struct Edge {int a, b, w;bool operator< (const Edge & W)const{return w < W.w…

浅析Linux SCSI子系统:错误恢复

文章目录 概述SCSI错误恢复处理添加错误恢复命令错误恢复线程scsi_eh_ready_devs IO超时处理相关参考 概述 IO路径是一个漫长的过程&#xff0c;从SCSI命令请求下发到请求完成返回&#xff0c;中间的任何一个环节出现问题都会导致IO请求的失败。从SCSI子系统到低层驱动&#x…

【快手小玩法-弹幕游戏】开发者功能测试报告提交模板

背景 快手有明确的要求&#xff0c;准入和准出更加严格&#xff0c;要求有明确的测试报告。格式如下&#xff1a; *本文参考字节wiki&#xff1a;CP侧测试报告模板(复制填写轻雀文档) 其他文章推荐&#xff1a;【抖音小玩法-弹幕游戏】开发者功能测试报告提交模板 一、前言…

Java后端开发面试题——集合篇

ArrayList底层的实现原理是什么 底层数据结构 ArrayList底层是用动态的数组实现的 初始容量 ArrayList初始容量为0&#xff0c;当第一次添加数据的时候才会初始化容量为10 扩容逻辑 ArrayList在进行扩容的时候是原来容量的1.5倍&#xff0c;每次扩容都需要拷贝数组 添加逻…

MMSegmentation训练自己的语义分割数据集

全流程&#xff0c;训练语义分割数据集 数据标注json转mask 运行源码MMSegmentation模型选择运行部分 数据标注 # 安装 pip install labelme # 启动labelme labelme然后 ctrl N 开启多边形标注即可&#xff0c;命名类为person 之后会保存到同目录下json文件&#xff1a; js…

WordPress(6)网站侧边栏倒计时进度小工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 效果图在这里插入图片描述一、添加位置二、主题style.css文件中添加美化1.引入库2.添加自定义的HTML模块效果图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 在主题中 child.js…

【1++的数据结构】之AVL树

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的数据结构】 文章目录 一&#xff0c;什么是AVL树二&#xff0c;AVL树的插入三&#xff0c;AVL树的旋转3.1 向左旋转3.2 向右旋转3.3 左右双旋3.4 右左双旋 四&#xff0c;验证AVL树是否平衡 …

Data truncation: Out of range value for column ‘id‘ at row 1

错误信息&#xff1a;Data truncation: Out of range value for column id at row 1 数据截断&#xff1a;第1行“id”列的值超出范围 很多人会回复&#xff1a;数据库 类型由int改为 bigInt 我看了表结构 可以放的下的。 是 bigint(20) 没有问题啊。 默认的 bigint 类型…

C语言面试题值反转字符串

知识捡漏本 1.C语言优先级 &#xff1a;左高于高于 右 2.定义宏函数product&#xff0c;调用product后&#xff0c;里面的i和i都是加两次1&#xff0c;i就是两个加2后的i相乘&#xff0c;i是开始的i和1后的i相乘。 3.用i (j4,k 8,m 16);这种定义方法&#xff0c;最终i和最后一…

dji uav建图导航系列()ROS中创建dji_sdk节点包(一)项目结构

文章目录 1、整体项目结构1.1、 目录launch1.2、文件CMakeLists.txt1.3、文件package.xml1.4、目录include1.4、目录srv在ROS框架下创建一个无人机的节点dji_sdk,实现必需的订阅(控制指令)、发布(无人机里程计)、服务(无人机起飞降落、控制权得很)功能,就能实现一个类似…