模块化到组件化再到插件化

控制反转,依赖注入:

耦合结构和解耦结构

目前我的项目的结构如下图所示,因为intent跳转和一些数据共享的关系导致的。

 

解耦合之后的结构:

 

 

解耦思想

控制反转是一种思想

依赖注入是一种设计模式

IoC框架使用依赖注入作为实现控制反转的方式

 

模块化开发

将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容。模块我们相对熟悉,比如登录功能可以是一个模块,搜索功能可以是一个模块,汽车的发送机也可是一个模块。

 

组件式开发

基于可重用的目的,将一个大的软件系统按照分离关注点的形式,拆分成多个独立的组件,已较少耦合。

将一个app分成多个模块,每个模块都是一个组件(Module),开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件等,但是最终发布的时候是将这些组件合并统一成一个apk,这就是组件化开发。

正常一个App中可以有多个module,但是一般只会有一个module是设置为application的,其他均设置为library,组件化开发就是要每个module都可以运行起来,因此在开发期间(Debug版本)每个module均设置为application,发布时(Release版本)设置为libs再进行合并。

组件可以分为两大类,一类是application组件,一类是libs组件,application组件是一个可运行的app。libs组件可以作为application的依赖,但是自身不可作为程序运行的存在。

模块化粒度更小,更侧重于重用,而组件化粒度稍大于模块,更侧重于业务解耦。

组件化想要解决的问题:

1.       实际业务变化非常快,但是工程之前的业务模块耦合度太高,牵一发而动全身.

2.       对工程所做的任何修改都必须要编译整个工程

3.       功能测试和系统测试每次都要进行.

4.       团队协同开发存在较多的冲突.不得不花费更多的时间去沟通和协调,并且在开发过程中,任何一位成员没办法专注于自己的功能点,影响开发效率.

5.       不能灵活的对工程进行配置和组装.比如今天产品经理说加上这个功能,明天又说去掉,后天在加上.

组件开发比较常见的问题是业务组件的相互引用:

 

为此我们可以通过路由/总线的方式去处理:

 

挂载到组件总线上的业务组件,都可以实现双向通信.而通信协议和HTTP通信协议类似,即基于URL的方式进行.

 

插件化开发

Android应用程序的.Java文件在编译期会通过javac命令编译成.class文件,最后再把所有的.class文件编译成.dex文件放在.apk包里面。那么动态加载就是在运行时把插件apk直接加载到classloader里面的技术。

关于代码加载,系统提供了DexClassLoader来加载插件代码。开发者可以对每一个插件分配一个DexClassLoader(这是目前最常见的一种方式),也可以动态得把插件加载到当前运行环境的classloader中。

相对于组件化开发主要要解决的问题:

1.       宿主和插件分开编译

2.       并发开发

3.       动态更新插件

4.       按需下载模块

5.       方法数或变量数爆棚

 

组件化的核心是角色的转换。 在打包时, 是library; 在调试时, 是application。

怎么理解组件化的概念 ?

Module的模式分两种, application和library。 library就是引用库,如你抽取的common。 application就是一个apk, 是一个完整的项目。

在调试时,我只关心我负责的模块,我希望我的模块是一个单独的app,因为这样更小,业务更专一,相对来讲修改与调试就会越省时省心,编译就会越快。试想当你需要改一段代码,既要关注自己的,也要关注别人的,是一种什么体验 ? 或者, 编译一个项目10M的代码和一个工程全部1G的代码,哪个比较舒服一些?

插件化

又有人问了: 插件化和组件化又有什么区别呢?插件化严格意义来讲,其实也算是模块化的观念。将一个完整的工程,按业务划分为不同的插件,都是分治法的一种体现。化整为零,相互配合。,越小的模块越容易维护。 插件化按理也算是模块化的一种体现,和组件化就不一个概念了。那么,到底有什么区别呢?

组件化的单位是组件(module)。
插件化的单位是apk(一个完整的应用)。
组件化实现的是解耦与加快编译, 隔离不需要关注的部分。
插件化实现的也是解耦与加快编译,同时实现热插拔也就是热更新。
组件化的灵活性在于按加载时机切换,分离出独立的业务组件,比如微信的朋友圈
插件化的灵活性在于是加载apk, 完全可以动态下载,动态更新,比组件化更灵活。
组件化能做的只是, 朋友圈已经有了,我想单独调试,维护,和别人不耦合。但是和整个项目还是有关联的。
插件化可以说朋友圈就是一个app, 我需要整合了,把它整合进微信这个大的app里面
其实从框架名称就可以看出: 组 和 插。
组本来就是一个系统,你把微信分为朋友圈,聊天, 通讯录按意义上划为独立模块,但并不是真正意义上的独立模块。
插本来就是不同的apk, 你把微信的朋友圈,聊天,通讯录单独做一个完全独立的app, 需要微信的时候插在一起,就是一个大型的app了。
插件化的加载是动态的,这点很重要,也是灵活的根源。

通信方式

模块化的通信方式,无非是相互引入;我抽取了common, 其他模块使用自然要引入这个module
组件化的通信方式,按理说可以划分为多种,主流的是隐式和路由。隐式的存在使解耦与灵活大大降低,因此路由是主流
插件化的通信方式,不同插件本身就是不同的进程了。因此通信方式偏向于Binder机制类似的进程间通信

你可能感兴趣的:(java,安卓开发)