Android组件化与插件化的差别在哪里,该怎么选型?

面试官: 组件化如何实现,组件化与插件化的差别在哪里,该怎么选型?
心理分析:面试官从架构层次 了解求职者是否用过 模块化 组件化 和插件化,在过去经验有没有运用过这些技术到项目中,这道题属于一个连环炮。求职者该格外小心
求职者:应该从App开发的需求来定义技术选型,分别说说模块化,组件化 插件化的优势和区别

单工程模式

问题:
1、实际业务变化非常快,但是单一工程的业务模块耦合度太高,牵一发而动全身;
2、对工程所做的任何修改都必须要编译整个工程;
3、功能测试和系统测试每次都要进行;
4、团队协同开发存在较多的冲突.不得不花费更多的时间去沟通和协调,并且在开发过程中,任何一位成员没办法专注于自己的功能点,影响开发效率;
5、不能灵活的对业务模块进行配置和组装;

模块化

将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容。模块我们相对熟悉,比如登录功能可以是一个模块,搜索功能可以是一个模块,汽车的发送机也可是一个模块。
组件化
基于可重用的目的,将一个大的软件系统按照分离关注点的形式,拆分成多个独立的组件,已较少耦合。

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

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

组件化的核心是角色的转换。 在打包时, 是library; 在调试时, 是application。
Module的模式分两种, application和library。 library就是引用库,如抽取的common。 application就是一个apk, 是一个完整的项目。

在调试时,关心负责的模块,该模块是一个单独的app,因为这样更小,业务更专一,相对来讲修改与调试就会越省时省心,编译就会越快。

组件化工程模型下的业务关系,业务之间将不再直接引用和依赖,而是通过“路由”这样一个中转站间接产生联系,而Android中的路由实际就是对URL Scheme的封装;
如此规模大的架构整改需要付出更高的成本,还会涉及一些潜在的风险,但是整改后的架构能够带来很多好处:

1、加快业务迭代速度,各个业务模块组件更加独立,不再出现业务耦合情况;
2、稳定的公共模块采用依赖库方式,提供给各个业务线使用,减少重复开发和维护工作量;
3、迭代频繁的业务模块采用组件方式,各业务研发可以互不干扰、提升协作效率,并控制产品质量;
4、为新业务随时集成提供了基础,所有业务可上可下,灵活多变;
5、降低团队成员熟悉项目的成本,降低项目的维护难度;
6、加快编译速度,提高开发效率;
7、控制代码权限,将代码的权限细分到更小的粒度;

组件化想要解决的问题:

  1.   实际业务变化非常快,但是工程之前的业务模块耦合度太高,牵一发而动全身.
    
  2.   对工程所做的任何修改都必须要编译整个工程
    
  3.   功能测试和系统测试每次都要进行.
    
  4.   团队协同开发存在较多的冲突.不得不花费更多的时间去沟通和协调,并且在开发过程中,任何一位成员没办法专注于自己的功能点,影响开发效率.
    
  5.   不能灵活的对工程进行配置和组装.比如今天产品经理说加上这个功能,明天又说去掉,后天在加上.
    

插件化

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

将一个完整的工程,按业务划分为不同的插件,都是分治法的一种体现。化整为零,相互配合。,越小的模块越容易维护

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

子模块划分

除了大家公认的common部分, 业务模块的划分尤为重要,相比于狭义上的架构,广义上的子系统的划分的关注点,很考验技术经验以及对业务的理解。

通信方式

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

一、组件化
就是把APP拆分成不同功能的模块,形成独立组件,让宿主调用。组件化不一定是插件化,组件化是一个更大的概念:把模块解耦,组件之间代码不依赖,宿主可以依赖组件
而插件化则是具体到了技术点上,宿主通过动态加载来调用组件,宿主不依赖组件,达到完全解耦的目的 (比如图片缓存就可以看成一个组件被多个 App 共用)。
适合于项目大,但是功能相对集中。比如一个金融类的APP里面只包含金融的功能,金融功能又会有借贷,理财,线下交易,把这些模块抽成单独的组件
二、插件化
主要原理是:主要利用 Java ClassLoader 的原理,如 Android 的 DexClassLoader,可动态加载的内容包括 apk、dex、jar 等。如下

1、业务组件解耦合,实现业务组件热拔插
2、更改迭代模式,由整个APP发版模式变成APP发版和业务插件发版流程
3、不更新APP版本即可BUG修复和业务组件升级等热修复功能
4、插件化建立在组件化架构之上,包含组件化所有优点
插件化的优势:
1,提高编译速度,节省开发时间.
2,业务模块解藕,便于后期维护.
3,团队开发便利.
4,动态更新插件,按需下载模块.
淘宝的框架是用了osgi的bundle概念,整个应用框架生命周期完整。
适合于项目超级大 但是功能相对不集中。比如 一个支付宝App 里面即包含共享单车 也包含 电影票。这种与本业务完全不同的 可以做成插件的形式插件化弊端:
每一个插件都是一个apk,插件多的时候管理起来也麻烦。

你可能感兴趣的:(2019年)