0%

模块化-3 模块通信

模块拆分以后,需要解决模块通信的问题,模块通信包含页面跳转、模块间事件通信、模块间服务三大块;

1 页面跳转

页面跳转这块的方案都比较成熟,通过路由的方式跨模块跳转,开源也有比较成熟方案ARoute、WMRoute,
ARoute整体限制较多,弱化了host的概念,path有分组的概念,至少需要两级,对于封闭app模块化基本满足。但对于跨团队或者复杂的url场景比较麻烦。
WMRoute整体的设计扩展性比较好,url跳转比较灵活,和官方清单文件声明的路由概念类似。
原理上可以参考这两个开源库,针对自己的需求选择最合适的。

2 事件通信

事件通信有几种方式广播、bus。
但如果你将业务代码各自模块化之后,就有一个尴尬的问题摆在面前:Event事件放在哪里?因为很多库都需要收听这个Event事件,所以只能将Event下沉到基础库。这样导致的结果是基础库越来越大,还无法拆分。这个问题在下面的方案也可以被解决。

3 模块服务调用

现在比较通用的方法是使用接口服务,将接口注册到ServiceManager中,其他模块从ServiceManager获取实现类的方式。这块开源的路由库里面都有实现方案。
那如何暴露接口比较方便管理。这块自己参考了网上的一些方案、然后自己也思考了一些方案。

3.1 关于这点《微信Android模块化架构重构实践》也提到了这件事情,并且自创性的使用了一种叫“.api”化的方式来解决这件事情。原理通过gradle插件,实现通过api文件生成一个独立的module,这个接口module提供给其他模块引用。

3.2 将模块暴露的接口放在模块的其他文件夹,通过gradle插件,实现自己通过sourceSet配置文件路径的方式来依赖,

3.3 将模块暴露的接口放在模块的其他文件夹,通过gradle插件实现接口目录文件自动打jar包,提供给其他模块依赖,也有比较好的开源方案Mis

图片

1和2两种方案,第二种方案更加的好,所有文件都在一个mudule下管理,并且减少接口mudule的生成,项目mudule过多会导致不清爽的感觉。
但是这两种方案比较适合所有mudule在一个app工程下面,但是如果跨团队合作就无法满足需求,这个时候第三中方案就非常适合,可以提供接口jar给其他第三方使用。

通过几种方案的预研,第三方方案基本满足我们的需求,很多时候需要更多的思考,寻找适合自己的方案。