而是通过手写网络框架,手写数据库等等,主要是考虑两个方面:
- 减小SDK体积 ;
- 避免第三方接入的时候发生依赖冲突
当然,依赖库并不是说不能用,有时候一些数据统计的库需要依赖第三方,那这种情况是没有办法避免的,可以在对接文档中提供一个解决依赖冲突的办法
3.2 解决依赖冲突
方式一
在app的build.gradle中添加类似配置如下:
configurations.all {
resolutionStrategy {
//解决v4包冲突,强制使用这个版本的v4包
force ‘com.android.support:support-v4:26.1.0’
}
}
方式二
exclude
implementation(“com.xxx.xxx:xx”) {
exclude group: ‘com.android.support’
}
复制代码
exclude是最常用的解决依赖冲突的方式,但如果多个依赖库引入不同版本的其它库,需要分别写好多个exclude,显然第一种方式比较简单粗暴。
3.3 对外暴露的接口尽量少
面向接口编程,以游戏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) {
//支付逻辑
}
…
}
复制代码
实现类是我们的内部逻辑,我们不希望被外部访问到,外部只需要知道有 IGame
这个接口中的方法就行,我们可以再写个单例的管理类来给外部使用
/**
- 单例的SDK管理类
*/
object GameSDKManager :IGame{
//实现类私有化
private val gameImpl: IGame by lazy { GameImpl() }
override fun registerApp(application: Application, appId: String) {
gameImpl.registerApp(application,appId)
}
override fun init(activity: Activity) {
gameImpl.init(activity)
}
override fun login(loginCallBack: LoginCallBack) {
gameImpl.login(loginCallBack)
}
override fun pay(product: Product, payCallBack: PayCallBack) {
gameImpl.pay(product,payCallBack)
}
}
复制代码
kotlin
的object
关键字表示单例,
外部通过GameSDKManager.xxx
来调用SDK中的方法,
以后要提供其它方法,只要修改 IGame
接口,然后在 GameSDKManager
和 GameImpl
中分别实现即可。
当然,不是说一定要这样拆分三个类,这只是一个面向接口编程的例子。
四、游戏SDK的坑
游戏SDK前期开发自测可能是很顺利的,难度不大,但是在跟游戏对接的时候可能会出现一些问题, 什么ClassNotFound、Resource not found、依赖冲突、崩溃等等
,至于为什么这样,下面会介绍~
4.1 SDK要支持Eclipse
SDK 1.0 测试通过,正式上线,高高兴兴地把文档甩给对接方,心里想,这个我测过的没问题,demo也给了,只要按照文档和demo来,问题不大。
然而,对方回复了一句:“有Eclipse接入文档吗?”
我一脸懵逼,这都什么年代了,真还有人用Eclipse开发App?
我想试图说服对方用Android Studio,然后得到的回复是:其它的游戏SDK都提供了Eclipse的接入方式~
想起我上一次用Eclipse应该是大三的时候…
就这样,第二天下载了Eclipse之后,按照教程安装APT插件,然而编译一直报错,忘记具体的错误信息了,最终的解决办法是下载了一份Eclipse版本的SDK,Eclipse 不能使用Android Studio版本的SDK。
好了,Eclipse环境弄好了,hello world也跑起来了,开始写demo~
由于SDK的产物是aar,而