一、模块化、组件化与插件化
项目成长到必定程度,跟着人员的增多,代码越来越痴肥,这时刻就必须进行模块化的拆分。在我看来,模块化是一种指导理念,其核心思惟就是分而治之、降低耦合。而在 Android 工程中若何实施,今朝有两种门路,也是两大年夜流派,一个是组件化,一个是插件化。
提起组件化和插件化的差别,有一个很形象的图:

膳绫擎的图看上去比较清楚,其实轻易导致一些误会,有下面几个小问题,图中可能说的不太清跋扈:
组件化是一个整体吗?去了头和胳膊还能存在吗?左图中,似乎组件化是一个有机的┞符体,须要所有器官都健在才可以存在。而实际上组件化的目标之一就是降低整体(app)与器官(组件)的依附关系,缺乏任何一个器官 app 都是可以存在并正常运行的。
头和胳膊可以零丁存在吗?左图也没有解释白,其实谜底应当是肯定的。每个器官(组件)可以在补足一些根本功能之后都是可以自力存活的。这个是组件化的第二个目标:组件可以零丁运行。
组件化和插件化可以都用右图来表示吗?如不雅膳绫擎两个问题的谜底都是 YES 的话,这个问题的谜底天然也是 YES。每个组件都可以算作一个零丁的┞符体,可以按需的和其他组件(包含主项目)整合在一路,大年夜而完成的形成一个 app。
右图中的小机械人可以动态的添加和修改吗?如不雅组件化和插件化都用右图来表示,那么这个问题的答檀卷不一样了。对于组件化来讲,这个问题的谜底是部分可以,也就是在编译期可以动态的添加和修改,然则在运行时就没法这么做了。而对于插件化,这个问题的谜底很干脆,那就是完全可以,不论实袈溱编译期照样运行时!
本文重要集中讲的是组件化的实现思路,对于插件化的技巧细节不做评论辩论,我们只是大年夜膳绫擎的问答中总结出一个结论:组件化和插件化的最大年夜差别(应当也是独一差别)就是组件化在运行时不具备动态添加和修改组件的功能,然则插件化是可以的。
暂且摈弃对插件化“道德”上的批驳,我认为对于一个 Android 开辟者来讲,插件化切实其实是一个福音,这将使我们具备极大年夜的灵活性。然则苦于今朝还没有一个完全合适、完良图容的插件化筹划(RePlugin 的饥饿营销做的很好,但还没看到疗效),特别是对于已经有几十万代码量的一个成熟产品来讲,套用任何一个插件化筹划都是很危险的工作。所以我们决定先大年夜组件化做起,本着做一个最彻底的组件化筹划的思路去进行代码的重构,下面是比来的思虑结不雅,迎接大年夜家提出建议和看法。
二、若何实现组件化
要实现组件化,不论采取什么样的技巧路径,须要推敲的问题重要包含下面几个:
- 代码解耦。若何将一个宏大年夜的工程拆分成有机的┞符体?
- 组件零丁运行。膳绫擎也讲到了,每个组件都是一个完全的┞符体,若何让其零丁运行和调试呢?
- 数据传递。因为每个组件都邑给其他组件供给的办事,那么主项目(Host)与组件、组件与组件之间若何传递数据?
- UI 跳转。UI 跳转可以认为是一种特别的数据传递,在实现思路上有啥不合?
- 组件的生命周期。我们的目标是可以做到对组件可以按需、动态的应用,是以就会涉及到组件加载、卸载和降维的生命周期。
- 集成调试。在开辟阶段若何做到按需的编译组件?一次调试中可能只有一两个组件介入集成,如许编译的时光就会大年夜大年夜降低,进步开辟效力。
- 代码隔离。组件之间的交互如不雅照样直接引用的话,那么组件之间根本没有做到解耦,若何大年夜根本上避免组件之间的直接引用呢?也就是若何大年夜根本上杜绝耦合的产生呢?只有做到这一点才是彻底的组件化。
把宏大年夜的代码进行拆分,Androidstudio 可以或许供给很好的支撑,应用 IDE 中的 multiple module 这个功能,我们很轻易把代码进行初步的拆分。在这里我们对两种 module 进行区分:
- 一种是基本库 library,这些代码被其他组件直接引用。比如收集库 module 可以认为是一个 library。
- 另一种我们称之为 Component,这种 module 是一个完全的功能模块。比如读书或者分享 module 就是一个 Component。

组件化简单拆分
2.2 组件的零丁调试
其实零丁调试比较简单,只须要把 apply plugin: 'com.android.library'切换成 apply plugin: 'com.android.application'就可以,然则我们还须要修改一下 AndroidManifest 文件,因为一个零丁调试须要有一小我口的 actiivity。
我们可以设置一个变量 isRunAlone,标记当前是否须要零丁调试,根据 isRunAlone 的取值,应用不合的 gradle 插件和 AndroidManifest 文件,甚至可以添加 Application 等 Java 文件,以便可以做一下初始化的操作。
为了避免不合组件之间资本名反复,在每个组件的 build.gradle 中增长 resourcePrefix "xxx_",大年夜而固定每个组件的资本前缀。下面是读书组件的 build.gradle 的示例:
- if(isRunAlone.toBoolean()){
- apply plugin: 'com.android.application'
- }else{
- apply plugin: 'com.android.library'
- }
推荐阅读
在数据中间范畴,这意味着企业须要对硬件成本进行严格审核,而这促使很多收集企业袈溱采购办事器硬件时选择不太传统的办法;即他们设计大年夜部分硬件,再交由定制制造商临盆办事器。这则意>>>详细阅读
本文标题:Android彻底组件化方案实践
地址:http://www.17bianji.com/lsqh/36376.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示