SDK
SDK(Software Development Kit)是软件开发工具包的缩写,一般来说,SDK是用于给开发人员提供进行应用程序开发的工具的,这样程序员就可以快速的开发出应用软件,省去了编写硬件代码和基础代码框架的过程,我们常见的Android SDK就属于这一类。除了这种比较大的SDK,我们平时开发的library也属性SDK,只不过功能比较单一,适用的场合也比较简单,如短视频SDK、推送SDK,分享SDK等。而我们所做的游戏SDK主要是用于第三方游戏开发接入我们的账号体系和支付体系,类似于友盟分享等聚合SDK。
游戏SDK
游戏SDK是啥
在游戏行业中,会存在两个最基本的角色,即游戏开发和游戏运营,一个游戏能不能成功,除了技术体验好之外,运营是一门很重要的学问,他们的关系如下图所示。
正如前面说描述的一样,游戏和运营往往是单独开来的,除非像腾讯、网易这些头部大公司,不仅可以自己研发游戏,还有实力自己推广和运营游戏。不过,事实上,很多小的游戏开发商就那么几个人或者几十个人,根本没有自己的运营能力,而市面上正好有专业的游戏运营公司,这时候它们就开始合作了。

在上面的图例中,小红是做社交App的娱乐公司,日活几千万,想让自己平台多元化,比如做个游戏下载的功能,给用户下载,用户觉得好玩,可能就会付费买装备,但是有个问题,小红并不会做游戏,如果单开一个产品线去研发游戏,投入是相当巨大的,所以想到能不能去外面接游戏进来。
游戏SDK的流程图
游戏SDK最核心的功能就是登录和支付,其它都是一些运营相关的,例如埋点、数据统计、崩溃等等。其中,登录的流程大体如下。

而支付的流程大体是先SDK,然后再通知游戏支付结构,流程如下所示。

游戏SDK开发要求
游戏SDK作为基础SDK,通常需要遵循一些基本的开发规范,例如,尽量少用第三方库、减少对外接口、明确技术文档等。
少依赖
作为SDK,我们应该尽量少使用开源库或者说不用开源库,尽量直接使用系统提供的库,实在不行也可以手写网络框架,手写数据库等等,主要基于以下两个方面考虑。- 减小SDK体积 ;- 避免第三方接入的时候发生依赖冲突
解决依赖冲突
当然,依赖库并不是说不能用,有时候一些数据统计的库就需要依赖第三方库,那么对于这种情况冲突是不可避免的,通常解决冲突有两种常见的手段。
强制使用某个版本,例如:
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:26.1.0' //解决v4包冲突,强制使用这个版本的v4包
}
}
很多做应用开发的都知道,如果一个项目中重复使用了某个库,那么可以使用exclude排除某个依赖,如下:
implementation("com.xxx.xxx:xx") {
exclude group: 'com.android.support'
}
exclude是最常用的解决依赖冲突的方式,但如果多个依赖库引入不同版本的其它库,需要分别写好多个exclude,显然第一种方式比较简单粗暴。
减少对外接口
对于SDK开发,对外的接口尽量越少越好。以游戏SDK为例,对外暴露的接口一般有SDK初始化、登录、支付等,如下所示。
定义接口
interface IGame {
// 1、在Application中调用,
fun registerApp(context: ApplicationContext, appId: String)
// 2、在activity中初始化
fun init(activity: Activity)
// 3、业务接口,登录、支付等等
fun login(loginCallBack: LoginCallBack)
fun pay(product: Product, payCallBack: PayCallBack)
...
}
接口实现:
class GameImpl : IGame{
override fun registerApp(context: ApplicationContext, appId: String) {
//appid相关
}
override fun init(activity: Activity) {
//初始化逻辑,例如显示悬浮窗
}
override fun login(loginCallBack: LoginCallBack) {
//登录逻辑
}
override fun pay(product: Product, payCallBack: PayCallBack) {
//支付逻辑
}
...
}</