整个项目结构上分为4层。
其中game.apk由cp提供并直接集成聚合sdk进行初始化,登录,支付等流程打通。
聚合SDK负责查找和加载三方插件进行流程分发。
中间层SDK直接引用聚合SDK以及业务SDK,实现插件加载规范,并做业务隔离。
以初始化为例,整个流程如下,其他诸如login,pay等流程类似。
在整个流程上,由于游戏apk里面是没有中间层和业务sdk层代码的,所以需要我们反编译游戏apk进行二次打包实现。
插件加载流程设计
首先解决聚合SDK如何查找并加载插件的问题,由于聚合SDK和业务SDK并没有直接的发生联系,并且在游戏集成聚合SDK打包的过程中,其实是没有中间层SDK以及业务SDK存在的。
初始化
聚合SDK新增接口Channel
1 | public Interface Channel { |
在聚合SDK进行初始化的时候去assets目录通过查找配置文件的方式,找到Channel实现类
中间层SDK在assets目录增加配置文件 plugins.xml
1 | class implements Channel { |
1 | <?xml version='1.0' encoding='UTF-8'?> |
聚合SDK初始化,去assets查找plugins.xml文件并解析出我们的Channel实现,后续的init,pay等流程就由MyChannel接管。
那么问题又来了,游戏只集成了聚合SDK,游戏包并没有中间层SDK以及plugins.xml呢。这就涉及到另外一个实现机制了,反编译 & 重打包 。
拿到游戏母包(集成了聚合SDK的apk)以后,我们将母包进行反编译,然后把我们聚合SDK和业务SDK通过打包流程,把smali和资源进行整合到母包中,然后再重编译,签名,安装,测试,发布。