Android彻底组件化方案实践彻底组件化方案实践
一、模块化、组件化与插件化
项目发展到一定程度,随着人员的增多,代码越来越臃肿,这时候就必须进行模块化的拆分。在我看来,模块化是一种指导理
念,其核心思想就是分而治之、降低耦合。而在 Android 工程中如何实施,目前有两种途径,也是两大流派,一个是组件化,
一个是插件化。
提起组件化和插件化的区别,有一个很形象的图:
上面的图看上去比较清晰,其实容易导致一些误解,有下面几个小问题,图中可能说的不太清楚:
组件化是一个整体吗?去了头和胳膊还能存在吗?左图中,似乎组件化是一个有机的整体,需要所有器官都健在才可以存在。
而实际上组件化的目标之一就是降低整体(app)与器官(组件)的依赖关系,缺少任何一个器官 app 都是可以存在并正常运行
的。
头和胳膊可以单独存在吗?左图也没有说明白,其实答案应该是肯定的。每个器官(组件)可以在补足一些基本功能之后都是可
以独立存活的。这个是组件化的第二个目标:组件可以单独运行。
组件化和插件化可以都用右图来表示吗?如果上面两个问题的答案都是 YES 的话,这个问题的答案自然也是 YES。每个组件
都可以看成一个单独的整体,可以按需的和其他组件(包括主项目)整合在一起,从而完成的形成一个 app。
右图中的小机器人可以动态的添加和修改吗?如果组件化和插件化都用右图来表示,那么这个问题的答案就不一样了。对于组
件化来讲,这个问题的答案是部分可以,也就是在编译期可以动态的添加和修改,但是在运行时就没法这么做了。而对于插件
化,这个问题的答案很干脆,那就是完全可以,不论实在编译期还是运行时!
本文主要集中讲的是组件化的实现思路,对于插件化的技术细节不做讨论,我们只是从上面的问答中总结出一个结论:组件化
和插件化的最大区别(应该也是唯一区别)就是组件化在运行时不具备动态添加和修改组件的功能,但是插件化是可以的。
暂且抛弃对插件化“道德”上的批判,我认为对于一个 Android 开发者来讲,插件化的确是一个福音,这将使我们具备极大的灵
活性。但是苦于目前还没有一个完全合适、完美兼容的插件化方案(RePlugin 的饥饿营销做的很好,但还没看到疗效),特别是
对于已经有几十万代码量的一个成熟产品来讲,套用任何一个插件化方案都是很危险的工作。所以我们决定先从组件化做起,
本着做一个最彻底的组件化方案的思路去进行代码的重构,下面是最近的思考结果,欢迎大家提出建议和意见。
二、如何实现组件化
要实现组件化,不论采用什么样的技术路径,需要考虑的问题主要包括下面几个:
代码解耦。如何将一个庞大的工程拆分成有机的整体?
组件单独运行。上面也讲到了,每个组件都是一个完整的整体,如何让其单独运行和调试呢?
数据传递。因为每个组件都会给其他组件提供的服务,那么主项目(Host)与组件、组件与组件之间如何传递数据?
UI 跳转。UI 跳转可以认为是一种特殊的数据传递,在实现思路上有啥不同?
组件的生命周期。我们的目标是可以做到对组件可以按需、动态的使用,因此就会涉及到组件加载、卸载和降维的生命周期。
集成调试。在开发阶段如何做到按需的编译组件?一次调试中可能只有一两个组件参与集成,这样编译的时间就会大大降低,
提高开发效率。