最简单有效的Android组件化方案,github开源地址 https://github.com/beyondxia/modules
1 、什么是组件化
在谈什么是组件化之前,我们需要先了解什么是业务模块。那什么是业务模块呢,从研发角度来讲,说白了,就是APP中一些功能相对较独立的,又一个或一波人维护的,有独立业务形态的代码集合。配一张图感受一下_,购物模块,会员模块,电影模块,酒店模块等一般就可以理解为一个业务模块。
其实我们的组件化就是针对业务模块开展的,每个业务都能成为一个独立的组件,可以独立开发,独立编译(甚至独立运行和测试)。业务之间通过一系列的接口或协议作用通信的桥梁,除此之后,大家互不关心,各业务独立完全隔离。
2 、为什么要组件化
由于每个业务模块的开发人员往往是不同的,试想一下,如果所有的模块代码都位于一个代码仓,所有的模块代码都是耦合在一起,没有组件的概念,那么:
- 开发效率必然会比较低,定位问题比较难
- 代码修改风险高,一个模块代码的修改,可能会应用其他模块。
- 编译时间久,哪怕只是一个模块的修改,必须编译整个应用。
- 代码结构不清晰,架构不够稳定,也不便于扩展和组件复用
- 等等
3、组件化开发步骤
要实现组件化开发,主要要做两件事:1. 首先需要业务间代码解耦。2. 组件间通信
4、实现方案
4.1、解耦
按照组件化开发步骤,实现组件化首先要实现的是代码间解耦,解耦的目的是让业务间没有任何代码依赖,没有代码交叉调用,但是又要能做到解耦后的正常通信和数据传输。
针对解耦,目前传统的做法是接口暴露方式:业务模块以接口或协议的方式暴露该模块的方法和功能,主app启动时(或适当的时机)注册各个业务暴露的方法和功能,我们也采用了类似的做法,架构图如下:
每个业务模块以service的方式暴露自己的功能和接口给到中间服务层(位于业务层之下),服务层收集各个业务暴露的方法和接口,在应用启动时(或适当的时机)注册,其他业务模块向服务层获取各个模块暴露的服务, 如图中红色部分。
服务层维护一个HashMap存放虽有的服务,如下:
并提供注册和获取服务的方法:
建议每个业务模块注册一个服务,当然,可以根据业务的,一个模块也可以注册多个服务:
其他业务模块根据服务名获取服务并调用服务暴露的方法:
至此,我们可以通过增加中间服务层的方式,达到代码解耦的目的。这也是目前业界解耦的常用方法。
4.2、通信方式
业务隔离后,就需要一套通信方式,使各业务可以进行方便高效的通信,其实通信方式,莫过于以下三种:
-
call(模块间函数调用):每个独立的业务模块暴露Service接口,供外界调用,如:
-
notify/publish(模块间通知):每个业务模块注册全局的感兴趣的事件,事件产生后通知 ,可以使用rxbus,通知,路由等方式,本文赞不对该项进行讨论:
router(模块间页面跳转):UI跳转 ,统一使用路由方式,三端统一路由可以使用Arouter,ActivityRouter等开源框架,本文暂不做讨论.
至此,通信方案介绍完成。