Android开发经验谈Android开发Android技术知识

业内首个支持渐进式组件化的开源框架

2018-06-17  本文已影响80人  billy05

前言

项目大了,编译慢了,开发效率低了,怎么办?
也许你已经知道了组件化,但项目迭代任务紧张,根本没有时间进行整体解耦,更害怕一下子改动太大导致的风险不可控,不敢大改,怎么办?

先别急着放弃,渐进式组件化了解一下

背景故事

在实行组件化改造之前,我们对业内的一些技术文章及开源库进行调研之后,发现基本上千篇一律地都是基于路由这种方案作为通信引擎来实现组件化,重要的是组件化之前得先解耦原来的项目代码。很尴尬,我们没那么人力和时间来一下子做这么一大块事情。这时候我们是这样想的:

正式由于项目代码耦合度高,解耦困难,而且迭代任务紧张,没办法单独抽出时间来解耦,导致组件化改造一直停留在口头上。

为了在不影响业务迭代业务开发的前提下也能用组件化的形式来进行开发,我们设计了一个支持立即组件化开发 & 渐进式组件化改造的框架:CC(已开源,点这里看源码

快速了解CC

用CC来立即开始组件化开发并渐进式地改造你的项目

先了解一下渐进式组件化改造的概念

以i百联为例(上海百联集团旗下的一个电商App)来看一下组件化之前项目中存在的耦合情况:

最终项目的耦合状态是这个样子的:

组件化之前项目的耦合状态组件化之前项目的耦合状态

为了能让大家看得清楚,图片上仅仅列出了有限的几个模块,但即使是这样,我们用一团乱麻来形容它也毫不为过。

我们的工程师一直是在这样的环境下进行业务迭代开发和bug修复,改代码要小心翼翼,生怕引起其它逻辑出bug,最主要的是开发/调试效率非常低:在使用了maven的情况下,在15吋高配的macbook pro上编译运行每次都要花3-5分钟,在16GB内存的windows台式机上更是动辄10-15分钟,严重影响开发效率,组件化势在必行。

但业务迭代排期时间非常紧张,测试资源不足,我们需要的是:立即组件化开发 & 渐进式组件化改造

在了解渐进式组件化改造之前,先来看看与之相对的非渐进式组件化改造

非渐进式组件化非渐进式组件化

非渐进式的组件化方案要求我们必须在组件化初期立即对项目进行解耦,至少是我们需要被新业务调用到的组件需要解耦成组件,否则新业务组件脱离主app单独运行调试的时候无法正常工作。

在渐进式组件化的方案中,可以先不用解耦,只需要让单独运行的组件能够调用到主App中的功能即可。思路是这样的:

渐进式组件化渐进式组件化

动画旁白:

CC是怎么做到这一点的?

首先,CC的核心通信引擎采用的不是路由方案,而是组件总线方案(路由 vs 组件总线

CC采有2套调用流程:App内部组件调用和跨App调用。

框架在接收到组件调用请求时,优先查看当前App内是否有本次CC调用指定的组件

App内部调用执行流程App内部调用执行流程

采用组件总线的方案,在App内部调用组件时,等效于直接调用IComponent.onCall(cc)方法,将调用方设置的调用参数传递给组件,组件执行完之后将执行结果返回给调用方,这个过程中没有使用反射,执行效率高

在这个过程中,CC完成了一次调用请求的转发:查找到组件对象,并将调用其onCall方法,将调用参数发送给它,并将组件执行的结果返回给调用方

悄悄地告诉你:CC中自带3种AOP策略,例如动画中显示的CustomerInterceptors就是其中之二:全局拦截器和针对本次CC调用的拦截器。定义一个拦截器也很简单:实现IGlobalCCInterceptor接口即可

跨App调用执行流程跨App调用执行流程

通过RemoteCCInterceptor与另一个App的ComponentService建立连接,将CC中的调用参数传递给ComponentService,在ComponentService中使用这些参数,发起一个App内部的CC调用,最终通过LocalCCInterceptor调用到IComponent.onCall(cc)

组件的执行结果原路返回给调用方

在这个过程中,CC完成了2次调用请求转发:

可以看出,跨App调用时:

总结

本文从我们在实际实施组件化过程中的一些思考入手,引入了渐进式组件化的概念,介绍了用CC来实现立即组件化开发 & 渐进式组件化改造的实施步骤。

并用动画的方式向大家展示了渐进式组件化与非渐进式组件化的区别以及支撑CC实现渐进式组件化的组件调用流程。

本文中的图片及动画取自上周末(6月9日)在爱奇艺移动技术沙龙分享时的演讲稿,PPT文档可在CC交流群(QQ群:686844583)的群文件中下载,欢迎加群交流。

点击这里了解更多CC相关的内容

上一篇 下一篇

猜你喜欢

热点阅读