本篇文章主要分享一个android快速组件化的方案,在当前的开发中,进行组件化开发能够很大程度的解耦,并且在业务逻辑的分工上更为明确,了解组件化开发势在必行。
在传统的开发上,我们往往在android studio中工程结构是这样的:
一个主module( app ),在app根据业务或者功能划分各个不同的包:packageA、packageB...在这样的单工程结构下,当代码越来越多的时候代码耦合度不免会越来越高,从而增加了单个业务维护的成本,同时对单处的修改需要整个工程编译。
而在组件化开发下,不仅可以避免这些问题,在项目的结构下也会清楚很多:
---------组件A
app(主工程)-------------组件B
---------组件C
.......
主工程依赖了各个不同功能的组件,主工程在使用它们时只需要调用暴露出来的接口就行,每个组件可以单独进行开发,比如组件A对应业务A,当程序员A对业务A进行开发时就可以去掉其他不必要的组件的依赖单独进行业务A的开发,也就是说每个组件单独开发,互不影响,也没有耦合。
一、如何让组件A单独运行,单独开发
当我们新建一个项目时,点开app目录下的build.gradle,其中第一行是:
然后我们添加一个测试组件化的module并依赖进来,依次点击file--->new---->new module,选择android library,取名为componentlib,点击finish。添加进来之后,打开componentlib下的build.gradle,查看第一行:
所以每个moudle下build.gradle文件的第一行内容决定了该module是可运行的主module还是被依赖的子module(也就是组件,我们说的组件A其实对应的就是mouduleA),那么当我们做componentlib的单独开发时也就是修改这一行的内容,但是不能每次都去手动改吧,而且当一个子module变成主module时势必也需要改变一些其他的内容(比如需要依赖其他的module等等),这些每次都手改实在也太麻烦了,其实对于整个工程来说,根目录下的gradle.properties内的内容是一个公共的引用,所以我们在这里定义一个值用来判断是集成开发还是组件单独开发:
isModule表示是否作为组件依赖,当isModule = true时,componentlib是一个app引用的组件;当isModule=false的时候,componentlib是单独运行的组件开发module。点开componentlib下的build.gradle再做如下修改:
最后把app下build.gradle中对componentlib的依赖去掉,修改完之后需要先点一下右上角的Sync Now,同步完毕之后工程中已经有两个可运行的module了:
在结构中app和componentlib的标识已经一致了。
二、manifest合并问题
但此时componentlib还不能真正的运行起来,试着去运行一下componentlib,android studio会提醒你没有默认的启动Activity,那么这里又有一个问题了,假设在componentlib下我添加了一个组件单独开发时用于测试业务A的ActivityB,这个Activity的启动标志和app中启动Activity是冲突的,如何解决呢,这里我们可以准备两份manifest文件,一份是集成开发下的,一份是组件单独运行的,我在componentlib下建立了一个module文件放置新的manifest文件,位置是src/main/module/AndroidManifest.xml:
然后点开componentlib/build.gradle,在android代码块中添加如下代码:
这里简单介绍下sourceSets这个关键字,在sourceSets中可以选择编译文件的位置或者是不编译哪些文件,在上面的图中,首先判断了是否是作为组件集成,是的话manifest用正常生成的,同时不编译我们自己添加的manifest文件(exclude表示不编译);如果不是则编译我们自己添加的manifest文件。
那么在module/manifest内我们就可以这么写:
同步之后并运行,可以发现componentlib已经可以跑起来了,现在工程中确实有两个可以运行的module:
这样子对于componentlib的业务就可以单独开发了,单独管理了。
三、其他问题
当我们采取组件化开发时会依次新建module,那这里就有配置的问题,每次都去修改build.gradle很麻烦,我们可以在根目录下的build.gradle文件里统一配置,在末尾加上:
在module/build.gradle中就可以这样引用:
第三方库的依赖也是一样的:
使用:
在各个组件开发完毕,集成开发的时候可能会有依赖冲突,这里可以用我们之前说的exclude关键字去重:
最后一个问题是各个module也就是各个组件之间的通讯,在开发过程中moduleA和moduleB对应两个业务,他们各自都依赖了一些公共的module(比如网络netwoirlib、工具toollib)但是互相彼此没有依赖,假设有一个业务场景是moduleA中的页面需要调到moduleB页面,这里就需要使用路由,这里主要说明路由使用的原因,推荐使用阿里的路由框架Arouter,地址:
大家可以了解其用法,对于Arouter,我的另一篇文章有简略分析Android 使用阿里ARouter页面跳转浅析 - 简书
这里分享了一个最简单基本的组件化方案,要把组件化玩的好还是要在开发中去具体实践,感谢您的阅读。