用android studio开发的同学应该都知道,androidstudio的架构是project-module形式,也就可以理解为一个项目由多个模块组成。在刚接触android studio时,它的这种架构引出了我一个想法------我们的app也可以使用这样的架构,一个app由多个模块组成,各个模块在自己的module包里。
例如我有一个app,有几大模块:main home,那么我们构建项目时,就可以分开多个module来构建这几大模块,而不是把这几大模块都放在一个module里面。这个想法我很早就有,也付出实践,但是初期的android studio效率非常差,以此想法来构建项目,在编译时非常耗时,几分钟,十几分钟,半个小时,甚至缓不过来,一直在那转圈,于是我就此作罢。
再到后来,有个新名词出现了,叫“组件化架构”,翻阅了一些相关文章,正是我之前研究的东西,不过加入了一些更好更完善的思想。这里我结合大牛们的思想和我自己的一些思想,来谈一下项目的“组件化架构”。
我以一个实际例子来一边讲解一边搭建项目结构,就以我们上面举的例子,它包含多个业务模块 main home ...。
那么我们的项目初始架构会是这样的:
这里需要注意一下,main组件的gradle文件中,apply plugin使用的是com.android.application
而其他的业务模块,使用的是 com.android.library
因为在最终的发布版中,其他业务组件是集成到main组件中的,main组件编译生成最终的application, 一起构成了可对外发布的完整app,其他组件可以以集成进来,也可以不集成进来,只会增加或者减少我们app的功能,但不影响我们app的最终发布。所以我们在新增module的时候,选择的类型应该是library。
各个组件都建立完成之后,接下来可以把组件集成到main组件中,集成非常简单,只需在main组件的gradle文件中,添加如下语句
实现非常简单,就是在业务组件中,分别定义一个activity/fragment,然后在main组件中,把这些fragment实例化加载到主页面就行。由于我们前面已经把其他业务组件都引入到了main组件中,所以编码和在同一个module中的编码是一样的,不需要做特别处理。
到此就实现了“组件化架构”了么?当然没那么简单,目前只是非常简单的集成。“组件化”不仅仅是把各个功能模块分开,还有模块之间如何通信,以及“组件化”的一大亮点------各个组件可以单独开发。
前面我们把各个组件集成到到main组件,现在我们把组件拆出来,单独开发,开发完后,可以再把组件集成到main中,发布。这是组件化开发的最大亮点(优点)。
这里我们把home组件单独出来开发。第一步,需要把其library模式改为application模式,因为只有application才可以单独运行,library必须依靠application才能运行。所以,接下来,我们就要在home所对应的gradle文件中做修改。
修改成
等要集成到main组件时,又得改回来,如果这样子手工去改,组件一多,修改起来麻烦,也不优雅。优雅的解决办法就是,设置一个开关,打开时,就是application模式,可以单独开发,关闭时,就是library模式,可以集成到main组件中。
在项目根目录下,有一个gradle.properties文件 在这文件中,我们可以添加一个常量isDebug,值设为true。
这里设置了常量之后,我们项目中的其他build.gradle文件都可以把这个常量读取出来,所以我们可以在home的build.gradle文件中,读取该常量的值,动态设置applyplugin。如图:
这样子设置之后,当我们需要切换模式时,只需要修改gradle.properties文件中isDebug的值,修改完成之后,点击Project sync按钮同步一下
还要记得修改main build.gradle文件里面 加入判断
接下来,还得修改 AndroidManifest.xml。因为当我们把一个module设置为application时,其AndroidManifest.xml需要包含一个app所需要的属性,例如app的icon、theme、launch Activity这些属性设置,而当module为library时,上面所提的这些属性都不需要用到,所以当我们处于不同模式时,AndroidManifest.xml文件也得不同。我们在home的src文件夹中新创建一个目录为debug目录,再把我们用于debug时的AndroidManifest.xml文件放进去。由于在Android目录模式下比较难创建这个目录,所以我们可以选另外一种目录模式(Project目录模式),然后再创建debug目录(很绕,直接看下图就会明白了)。
以上内容会有很多错误提示,其实提示的无非就是资源找不到,我们只需要把这些资源给加上就好了。可以把main组件中相应的资源拷贝过来,放在对应的目录下就可以了。
接下来在home组件的build.gradle文件中,指定不同模式下的AndroidManifest.xml文件。注意:这一坨一定要放在android里
以上设置完成,并且sync project home组件会是这样的目录
并且android studio的运行app里面,多了一个可运行的app,就是home。
最后再主要我们在home模块里面 创建 activity 并且加入相应布局 就完成了
以上步骤完成之后,home就可以单独作为一个app来开发了,我们可以直接运行该组件。
至此,我们已经可以随意的集成或者拆分组件,这里总结一下“组件化”的优点:
1、 业务模块分开,解耦的同时也降低了项目的复杂度。
2、 开发调试时不需要对整个项目进行编译。
3、 多人合作时可以只关注自己的业务模块,把某一业务当成单一项目来开发。
4、 可以灵活的对业务模块进行组装和拆分。
总而言之,言而总之,就是把一个项目分开成多个项目所具有的优点。
实际项目中,总有一些资源需要共用,例如第三方库、自定义的工具类、自定义的view等等,甚至我们的theme。那么这些资源在“组件化”中,应该如何处理?每个组件都各自引入?
如果每个组件都各自引入这些共用资源,一方面效率差,如果一个类是所有组件都用到的,那么就得每个组件中都新增这个类,一旦这个类修改了,还得一个组件一个组件的来修改这个类;另一方面,第三方类库也有可能会冲突,例如不同组件引用了相同的第三方库,但是版本不一样,就冲突了。还有诸多问题,就不一一列举,所以,我们得用另外的方式来处理
解决的办法就是,也把共用库组件化,然后其他组件引用它。
有兴趣的同学可以自己研究研究