如何设计C/S架构的Android SDK | 2. 如何设计一个无感的通信层?

43 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

在C/S架构的SDK中,客户端(可能有多个)和服务端运行在不同的进程中。客户端与服务端通过IPC通信,进行接口的请求与结果回复。

Android实现了自己的一套IPC通信方式:Binder。我们需要在SDK内部实现一个代理,在代理类中遵照 AIDL指南 实现远程调用接口,避免客户端对远程调用的依赖。

基本流程

  1. 在SDK进行初始化时,建立远程连接。

    若连接建立失败,可在SDK内部进行重试,多次尝试均失败后,通过初始化回调接口反馈初始化失败。若连接建立成功,可以进行一系列开发者无需关注的初始化操作,然后通过初始化回调接口反馈初始化成功。

  2. 在SDK进行回收操作时, 主动关闭远程连接。

    当客户端应用正常退出,或暂时不需要使用服务端资源时,需要主动调用接口进行退出,解除对服务端的绑定。

  3. 当客户端或服务端异常退出时,需要主动关闭连接。

    当客户端应用崩溃时,无法主动调用SDK接口进行释放操作。服务端需要具备主动感知客户端异常结束的能力,在收到客户端端异常退出的消息时,主动释放相关资源。

对于Binder,可以通过 死亡通知机制linkToDeath 实现。

设计原则

  • 连接对于使用者是无感知的

    客户端不知道,也不关心IPC是否存在,SDK中应该进行完善的连接管理。

  • 保证连接的稳定性

    若连接建立失败、或异常断开,应该采用必要的机制进行重连。

  • 连接异常断开时需及时回收资源

    避免因为客户端的异常退出,导致服务端的状态异常,进而影响到其他的客户端。