手游SDK插件加载流程设计

整个项目结构上分为4层。

其中game.apk由cp提供并直接集成聚合sdk进行初始化,登录,支付等流程打通。

聚合SDK负责查找和加载三方插件进行流程分发。

中间层SDK直接引用聚合SDK以及业务SDK,实现插件加载规范,并做业务隔离。

以初始化为例,整个流程如下,其他诸如login,pay等流程类似。

upload successful

在整个流程上,由于游戏apk里面是没有中间层和业务sdk层代码的,所以需要我们反编译游戏apk进行二次打包实现。

插件加载流程设计

首先解决聚合SDK如何查找并加载插件的问题,由于聚合SDK和业务SDK并没有直接的发生联系,并且在游戏集成聚合SDK打包的过程中,其实是没有中间层SDK以及业务SDK存在的。

初始化

聚合SDK新增接口Channel

1
2
3
4
5
6
7
8
9
10
public Interface Channel {

void init(final Activity activity);

void login(final Activity activity);

void pay(final OrderInfo orderInfo, final Activity activity);

···
}

在聚合SDK进行初始化的时候去assets目录通过查找配置文件的方式,找到Channel实现类
中间层SDK在assets目录增加配置文件 plugins.xml

1
2
class implements Channel {
}
1
2
3
4
<?xml version='1.0' encoding='UTF-8'?>
<plugins>
<plugin name="fu.wanke.MyChannel"/>
</plugins>

聚合SDK初始化,去assets查找plugins.xml文件并解析出我们的Channel实现,后续的init,pay等流程就由MyChannel接管。

那么问题又来了,游戏只集成了聚合SDK,游戏包并没有中间层SDK以及plugins.xml呢。这就涉及到另外一个实现机制了,反编译 & 重打包 。

拿到游戏母包(集成了聚合SDK的apk)以后,我们将母包进行反编译,然后把我们聚合SDK和业务SDK通过打包流程,把smali和资源进行整合到母包中,然后再重编译,签名,安装,测试,发布。

upload successful