一、前言
随着国内手游版号申请难度的增加,以及防沉迷等一系列政策的影响,很多国内开发者纷纷开始寻求海外发行之路。那么手游出海首要的是需要一套适合海外发行和运营的手游SDK联运系统。
本系列我们就来开发一套这样的SDK,我们暂且称这套SDK为UGSDK。
整个UGSDK项目,暂时可以分为三大部分——Android客户端SDK部分、iOS客户端SDK部分以及服务端部分(目前不考虑H5游戏部分)。
本篇主要介绍UGSDK项目中Android客户端部分的整体结构和设计。
二、整体架构设计
1、坚持小而美,而不过分强调架构
所有的架构都只是一种思想,我们在借鉴地同时,需要坚持“简单、合适、合理”地原则。 常见的架构比如有MVC, MVP, MVVM以及Google倡导的Clean架构。我们在熟悉他们各自的使用场景和原理后, 最好结合自己的项目,做一个前期的架构规划。
对于SDK项目来说, 功能并不像app一样很复杂。所以我们在使用前端主流的架构选型时,需要适度地借鉴和考量。我们的原则和之前我们说到的一样:“简单、合理、合适”。
2、设计的难点
对于UGSDK项目Android客户端SDK来说, 可能难以控制的点主要是对业务流程的控制,比如SDK的登录流程、注册流程、游客升级流程等。直接生撸的结果,可能是在一个activity或者fragment中耦合了过多的逻辑,导致及其笨重的UI类,不利于组件的复用,也不利于后期的扩展和维护。
关于这个难点,建议有兴趣的同学可以看下这位大佬的文章:
如何优雅地构建易维护、可复用的 Android 业务流程
我们的UGSDK项目Android客户端SDK中,也基本采用这位大佬总结的fragment结合activity的流程管理方案。
3、模块化
对于UGSDK项目中Android客户端SDK来说, 对于通用的组件或者不同的业务,我们尽可能采用“高内聚、低耦合”的方式进行模块化封装,功能模块只对外提供单一且必要的交互接口。
模块化的封装有利于减低模块之间的耦合,也有利于功能的维护和扩展。
4、简化API设计
不管整个UGSDK内部功能有多少,有多复杂,对于给游戏层接入的API来说,我们需要设计地尽可能的简单直观。
因为UGSDK最终需要给到不同的游戏和厂商去接入。 不同的游戏有不同技术水平的研发同学。我们的API接口的核心设计原则就是简单,对于一个刚毕业甚至从未接过SDK的同学来说也能轻松快速完成接入。
另外,如果一个游戏接入UGSDK的时间平均能节省一天的时间,那么UGSDK被100个游戏接入,就能节省100天。功德无量。
4、最终设计
结合上面说到的模块化原则,我们进行一个简单的整体模块结构的设计,如下:
三、整体项目结构
1、项目组织结构
项目开发我们使用java,使用AndroidStudio进行开发。 整个UGSDK项目Android客户端在AndroidStudio中,我们根据一定的规则,采用多module+多包名的形式组织代码结构。
根据上图可见, 我们并没有严格按照上面模块设计的样子进行module的划分,因为这样粒度太小,也不利于代码结构和依赖关系的维护。所以我们以更高层次的结构来划分。
1、ug-common:通用库,里面是封装的通用组件,可以被所有其他模块依赖
2、ug-common-data:里面包含了客户端定义的数据类,可能被其他不同module依赖
3、ug-common-plugin:通用插件库,可以动态加载和配置插件,做到插件的可插拔。 比如可以将appsflyer插件方便地从SDK移除或者添加
4、ug-sdk:UGSDK 核心库,里面处理了SDK的登陆和支付等必要业务模块
5、ug-support-appsflyer: appsflyer数据统计插件的支持,基于ug-common-plugin,可以方便地移除或者替换
6、ug-sdk-test:SDK Demo工程,里面演示了游戏接入过程中对相关api的调用
2、SDK目录结构划分
上面代码module的划分中,ug-sdk是我们整个Android客户端SDK的核心部分,我们看下里面的包名结构:
上图我们尽可能展示了客户端SDK中两个核心部分,一个是通讯协议(api包名下),一个是UI和流程管理(ui.activities包名下)
1、api:该包名下面封装了网络协议部分,主要负责和服务端的协议交互,以及响应数据的解析。
2、service: 该包名下面主要封装处理了不同业务模块的逻辑,比如登录(包括第三方登录)、支付等。
3、store: 该包名下面主要封装了数据存储部分的逻辑。
4、ui.activities.fragments: 该包名下面主要封装了各个UI界面,每个UI界面采用单独一个fragment。
5、ui.activities: 该包名下面的每个业务流程对应一个activity。比如登录、注册、重置密码以及游客升级。
6、ui.base:该包名下面封装了UI、流程控制,以及UI生命周期管理等逻辑。
7、UGPlatform: 该类是向游戏层暴露的API调用单例类,也是游戏层需要唯一调用的一个类。
好了,后面我们我们再来就其中各个模块开专门的篇幅来扒一扒。