android组件化之路

一、背 景

随着APP版本的不断迭代,业务功能的复杂度不断地增加,新的功能也在不断地增加,APP的体积日趋增大,每个模块的代码量也在不断的增多,按照这样的发展趋势下去,势必会严重影响开发的效率,增加项目的维护成本。我们假设团队增加一位成员,那么新员工需要对整个单一结构的大工程的代码有个基本熟悉才敢动手开发,这里可能需要一两周事件来读代码,而且两周的时候还只是基本了解的程度,这就很难很好的进行团队协作开发,每个团队成员负责的工作没有清晰明确的代码界限。再者,这种单一工程组成的大项目还会导致一个严重的编译耗时问题,每修改一小处代码,需要付出好几分钟甚至十几分钟的编译时间来测试验证结果。所以我们在寻求更加合理的架构方案来减轻上述的问题。

我们都知道,服务器端早就遇到过了类似的问题,当并发数不断增加,服务器端采用的技术方案是引入分布式,从而很好的用横向扩展的思维来分担减轻了单一服务器的压力,而技术是相通的,我们的APP从架构上能否达到类似的效果?让各个业务模块的增加进行横向扩展?答案显然是可以的,那就是我今天要介绍的主角--组件化。

二、什么是组件化?

组件化是一种架构思想,是一种架构指导,它约束了各组件之间的代码边界,使得各个组件可以进行独立的开发,独立的运行调试,同时,各组件开发完了可以极为方便地集成组装到任一一个项目。就像制造一架飞机,各个零部件就像是一个组件,一个组件就是一个已经打包过的半成品,引入组件的功能将非常地方便。

三、模块化、插件化与组件化区别

先说模块化,模块化是很早的概念,模块化同样也是一种指导思想,其核心思想就是用来对减少各业务模块之间的耦合,这里有一个比较明显的区别,就是模块化主要做到的是减少耦合,形成比较清晰的高内聚低耦合的软件项目结构;从耦合度这一点上我可以说组件化是模块化的升华,组件化要求各个模块必须要完全解耦,各组件之间拥有清晰的代码边界,同时,组件化比模块化更强大的优点在于,组件是半成品,是可以独立打包运行调试的,这样极大的提高了团队协作开发的效率,以及组件的可复用性得到极大提高。

插件化又是什么呢?插件化应该是最初由android开发者提出,比较有名气的有滴滴的VirtualAPK,360手机助手的DroidPlugin ,携程的DynamicApk 等...插件化其实比组件化更加的强大,它不旦要求各个插件的独立编译运行调试,而且各插件是支持热拔插的,从而可以实现动态部署的功能。

那我为什么不使用插件化呢?虽然近年来,原生开发的大神们的想法都是在围绕原生的动态化实现上,希望原生拥有H5一样的动态修改和部署的能力,但是笔者要设计的架构主要是针对金融类APP,金融项目对安全性、稳定性和健壮性的要求极高,所以我摒弃了插件化;目前开源的插件化方案或多或少都有一些问题和待踩的坑,或多或少的都使用了一些类似hook系统级服务的手法,这些方式极大可能随着官方Android系统版本的发布而出现各种各样莫名其妙的问题。且插件化提供的功能,完全可以通过组件化+热修复组合来达到完全相同的效果。

四、组件化工程框架

首先我们看看非组件化工程,其一般为复杂度较低的单一工程结构,例如:

虽然业务模块进行了分包,但实际上各个业务之间的依赖关系属于你中有我,我中有你,夸张点类似下图(债券通就很相似):

这种类似的架构出现的问题是显而易见,各个模块之间看似有分包处理,实则依赖关系还是复杂耦合的,缺少任意一个依赖项目都无法跑起来,既不利于代码的维护性、扩展性,更难谈模块的高度可复用性,一般复用都需要移植改造很多代码,修改较多的依赖逻辑。

那么,我们再来看看组件化工程结构,下图是笔者的android 组件化之路框架图:

我们可以看出,一个空壳工程里面装着各种各样的组件,组件之间是相互独立的,组件之间的调用由路由器来实现完全解耦,那么实现了组件的随意删减和重用。

Android组件化之路达到的效果

1、工程结构清晰,各组件以module的形式存在,方便移植复用:

-- app:空壳工程

-- main:主界面组件(可定制和更替)

-- componentserver:组件服务,提供组件的注册和生命周期管控等

-- componenta:组件a(举例)

-- componentb:组件b(举例)

-- componentc:组件c(举例)

-- fcscbaseframwork:后期Aboot核心,提供搭建一个移动app的基础功能包,包括网络通讯库、图片加载缓存库,事件分发库,数据库操作,文件存储,各视图基类的封装等具备快速开发一个app的核心库

-- common:资源文件、实体类、常量类等

-- fcscuilib:自定义控件库

2、支持一键开启关闭组件开发模式,实现组件独立编译,独立运行。

当配置组件化运行的时候,可选各个组件独立编译运行和调试

当置为false,则集成各个组件编译运行app。

3、组件支持发布到公司私有maven仓库,需要集成的时候仅需一句话依赖aar

总 结

一、组件化带来的好处:

1、清晰的代码边界,自己负责好自己的组件模块,使得团队协作开发效率成倍提高;

2、大幅加快组件化开发的编译速度,独立编译运行大幅度简化新业务的开发难度;

3、组件化架构支持横向扩展来适应不断增加的业务需求,可容纳大型复杂的APP需求;

4、清晰的工程结构更方便维护和新人快速加入团队开发;

5、组件的可重用性效果达到最佳,极为方便移植集成,避免重复造轮子

......

二、后期规划设想:

1、可否考虑采用多进程模型支持各组件运行在独立的进程空间?主app占守护进程以最高优先级运行提高后台存活,内存不足的时候方便释放非主要组件;

2、可否采用本地服务器模型的通信来代替路由?支持同步和异步调用,除了调用启动组件的基础功能,还支持非启动类型的功能性组件调用,如文件上传下载组件,可以异步获取组件提供的结果集;

3、采用编译时注解完成路由表的自动注册等简化开发工作量

待续......

Tips:本文大部分阐述围绕于组件化思想,仅少量文笔说明android 目前实现组件化的具体实现过程,考虑篇幅和文章的受众,如果大家对实现过程比较感兴趣,欢迎大家在评论区留言,下次可以单独分享Android组件化具体实现的过程和大家一起探讨交流。

最后,此文在一票难求的回家途中完成的编辑,在此预祝大家新年快乐,狗年吉祥!

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180207G0E75100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券