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

参考:

http://blog.xiaohansong.com/2015/10/21/IoC-and-DI/

http://blog.csdn.net/dd864140130/article/details/53645290

http://blog.csdn.net/smallspot/article/details/52221049

https://github.com/SpinyTech/ModularizationArchitecture

https://github.com/wutongke/ModularizationArchitecture

 

 

最近公司的项目从平台开发专向了针对平台开发,对此,我们作为开发人员理应当开始设计新的思路去面对公司今后的战略转型。于是,我们就希望项目能定制化功能,通过后台配置去加载相应的模块。为此看了一些相关内容。

控制反转,依赖注入:

耦合结构和解耦结构

目前我的项目的结构如下图所示,因为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.       方法数或变量数爆棚

这个坑有点多。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐