一篇文章搞懂 Android 组件化

640?wx_fmt=gif

热文导读 | 点击标题阅读

金九银十跳槽季如何进阶找到合适满意的工作?

那些一毕业就选择华为的人,后来都怎么样了

一款基于Kotlin+MVP+组件化的麻雀App(文末有彩蛋)

转自:zhshq

www.jianshu.com/p/8b6e6a50e21e


网上组件化的文章很多,我本人学习组建化的过程也借鉴了网上先辈们的文章。但大多数文章都从底层的细枝末节开始讲述,由下而上给人一种这门技术“博大精深”望而生畏的感觉。而我写这篇文章的初衷就是由上而下,希望别人在阅读的过程中能够觉得“组件化原来也就是这几个东西”的感觉。


1、首先我们来看一下组件化项目和传统项目的区别


在传统的项目里 

我们通常情况下会有一个commonLib的Libary模块和一个app的application模块,业务中的逻辑都写在app中各个功能模块放到不同的包下。这样做有以下几个主要的缺点:


1、无论分包做的再好,随着项目的增大,项目会逐渐失去层次感,别人来接手的时候会很吃力。

2、我们在debug一个小功能的时候每次修改代码都需要重新build整个项目,这样显的很不合理(不知道AS的热部署有没有解决这个问题)

3、多人联合开发在版本管理中很容易出现冲突和代码覆盖的问题


在组件化项目中

除了有commonLib和app模块外,我们按照功能划分各个业务组件模块(eg:微信可以划分出chat,contract,find,mine四个大模块),之前的包变成现在的模块,增加了层次感;每个功能模块可以单独编译,加快了编译速度,也为提供单元模块测试提供了支持;多人开发只负责自己的模块,直接避免了版本管理的冲突。


640?wx_fmt=other

图1-0组件化基本项目结构图


在明白了组件化为我们解决的主要问题后我们来看看需要怎么做


初步实现组建化其实我们最终要解决的问题就只有2个:


1、设置模块之间的依赖,且使得业务模块可单独编译--通过配置gradle即可解决
2、业务模块之间的页面跳转以及通信--使用阿里开源的ARouter即可解决

接下来我们具体来看一下如何操作
首先来看一下模块间依赖的问题

我们可以参照微信的四个模块(chat,contract,find,mine)来配置

首先我们项目基本结构如下:


640?wx_fmt=png

图1-1项目结构


我们一共需要建6个module,除了4个功能模块外还有一个基本的common库和一个作为启动的application。


在建好项目后我们需要给4个module配置一个是否单独编译的开关:


640?wx_fmt=png

图1-2单独编译各个模块的开关


关于开关的配置位置这是一个问题,我们把它添加在gradle.properties文件中,这样我们每次修改值的时候就可以触发gradle的重新构建,便于我们单独编译module。


我们单独编译的开关配置好了,现在我们来配置6个module之间的依赖关系:


640?wx_fmt=other

图1-3app和功能lib的基础依赖


首先,为了方便各个module之间的交互我们借用了阿里的充分ARouter库,所以在每个非common的库(包括主Application)中我都强烈建议加入对ARouter和commonlib的依赖。


其次,4个功能模块库我们要为它装上我们之前配置的是否单独编译的开关,我们需要修改如下2个地方:


640?wx_fmt=png

图1-4功能模块配置单独编译开关


可以看到我们要修改的就是我红框框住的地方,当我们的开关打开的时候,我们就把他当成一个单独的application来编译,并且赋予它一个独一无二的applicationId,这样我们就可以通过刚刚在gradle.properties中配置的开关来控制它是否单独作为一个application来编译。


而对于我们的入口module--app模块我们则需要做如下的配置:


640?wx_fmt=other

图1-5主module的gradle配置


我们除了需要配置基本的ARouter以及commonlib依赖以外还需要在app模块的gradle文件中根据开关选择是否需要依赖我们的功能模块,这个和各个功能模块中的配置是相呼应的。


而对于其他组件模块,重复上述步骤即可完成组件化框架的搭建:


640?wx_fmt=png

图1-6项目结构图


2、在完成了组件化框架的搭建后我们来简单的看看框架中一些具有特色的使用方法。


我们首先来看一下各个模块的页面间是怎样跳转的。

我们之前已经依赖了ARouter(详细用法参照https://github.com/alibaba/ARouter),我们要用它来帮我们实现跳转需要以下几步:


640?wx_fmt=other

图2-1


跳转的方法就如同图2-1中显示,我们需要标明目标页面,附带上要传送的参数,然后调用navigation()就可以跳转了,不过有人问目标页面怎么看着就是一个路径,它是怎样定义的?


640?wx_fmt=png

图2-2目标页面的配置


  • 首先要用@Route注解标注页面,并在path变量中给页面定义一个路径

  • 对于传送过来的变量我们直接定义一个同名的字段用@Autowired变量标注,Arouter会对该字段自动赋值

  • 最后我们还需要将该页面注入到ARouter中(原理类似ButterKnife),让他帮我们完成我们需要的工作


这样,我们就完成了页面间的跳转了,是不是比起我们传统的方法更加简单合理?


3. 最后我们来看一下组件间如何为彼此提供服务。


  • 这里我想在主module中调用home组件的sayHello方法来Toast一个人的名字

  • 那home里的方法怎样才能被其他模块(包括主模块和其他组件模块)调用



640?wx_fmt=other

图3-1公共接口的定义


首先在commonlib模块里创建一个暴露方法的接口,并定义接口签名,同时继承 Iprovider 接口


然后在home模块中继承commonlib里定义的接口,并实现签名方法。


640?wx_fmt=png

图3-2在提供方法的module中的配置


这里我们同样使用Arouter的 @Router注解来提供这次服务的路由。


最后,我们在其他模块使用 @Autowired 注解就可以调用该方法了


640?wx_fmt=png

图3-3对于方法的调用


可以看到我们同样使用了@Autowired注解来初始定baseService服务,并将页面注入Arouter中即可调用服务中的方法,且对于服务的依赖是基于接口的依赖,大大提高了其灵活性!


基本组件化框架的搭建就初步完成了,希望认真看完的朋友能有所收获!如有不正之处还望指正!


以上项目的码云地(欢迎参与改进):
https://gitee.com/zsq519/ARouterBaseProject

想进阿里吗?快加入我们的知识星球吧,如下:


640?wx_fmt=gif

如有收获,欢迎分享 640?wx_fmt=jpeg

「点赞640?「评论 640?wx_fmt=jpeg

 妈妈常教导我,让我养成良好习惯。这样长大才能成为一个有用的人。良好的习惯是尊敬师长这样长大才能成为一个有用的人。良好的习惯是尊敬师长,爱护同学,对人有礼貌;是不粗心,做事情不拖拉;还是爱护公物,不浪费粮食。为什么呢?因为拥有良好习惯,做一个品德高尚的人,懂得尊重别人,才会得到别人的尊重。我要努力地做到这些。我有一些坏习惯,有时候学习很粗心,把一些会做的题做错。在生活上,也很粗心,有一次早上起床居然穿反了衣服。我吃饭很慢,有的时候还剩饭。我还起床磨蹭,本来应该迅速地穿好衣服,但是,我总是磨磨蹭蹭地,速度很慢。我打算在这学期里,改掉这些坏习惯。早上起来,迅速地穿好衣服,不拖拉。学习不粗心,仔细完成每一道题。吃饭的时候,要很快的把饭吃完,不剩饭。我要从一点一滴做起,逐渐养成良好习惯。我相信自己一定能成为一名品学兼优的好学生!我打算在这学期里,改掉这些坏习惯。早上起来,迅速地穿好衣服,不拖拉。学习不粗心,仔细完成每一道题。吃饭的时候,要很快的把饭吃完,不剩饭。我要从一点一滴做起,逐渐养成良好习惯。我相信自己一定能成为一名品学兼优的好学生!  在上幼儿园以前,我什么也不会干,就连穿衣服也是妈妈给我穿好,就要上幼儿园了,这样可不行,妈妈锻炼我要学会自己穿衣服。   有一天,妈妈把衣服摆在我面前,开始让我自己穿。一开始。我又哭又叫就是不穿,还把衣服扔的满地都是,然后坐在地上开始大哭,等了好长时间,妈妈还是不理我,我只好自己乖乖的把衣服穿好, 一出了房间门,妈妈就笑了起来,再看看我的衣服,毛衣和裤子都穿反了,我赶紧回房间又重新穿了一遍,这次穿好了,拿起外套,可是外套的扣子又扣不上了,扣子可调皮了,好像故意和我作对,我把扣子往扣眼——人类邪恶的根源;爱情——幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话:幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话亲爱的!擦干你的眼泪,至高无上的爱情已经打开了我们的眼界,使我们成了它的崇拜者。是它,





 妈妈常教导我,让我养成良好习惯。这样长大才能成为一个有用的人。良好的习惯是尊敬师长这样长大才能成为一个有用的人。良好的习惯是尊敬师长,爱护同学,对人有礼貌;是不粗心,做事情不拖拉;还是爱护公物,不浪费粮食。为什么呢?因为拥有良好习惯,做一个品德高尚的人,懂得尊重别人,才会得到别人的尊重。我要努力地做到这些。我有一些坏习惯,有时候学习很粗心,把一些会做的题做错。在生活上,也很粗心,有一次早上起床居然穿反了衣服。我吃饭很慢,有的时候还剩饭。我还起床磨蹭,本来应该迅速地穿好衣服,但是,我总是磨磨蹭蹭地,速度很慢。我打算在这学期里,改掉这些坏习惯。早上起来,迅速地穿好衣服,不拖拉。学习不粗心,仔细完成每一道题。吃饭的时候,要很快的把饭吃完,不剩饭。我要从一点一滴做起,逐渐养成良好习惯。我相信自己一定能成为一名品学兼优的好学生!我打算在这学期里,改掉这些坏习惯。早上起来,迅速地穿好衣服,不拖拉。学习不粗心,仔细完成每一道题。吃饭的时候,要很快的把饭吃完,不剩饭。我要从一点一滴做起,逐渐养成良好习惯。我相信自己一定能成为一名品学兼优的好学生!  在上幼儿园以前,我什么也不会干,就连穿衣服也是妈妈给我穿好,就要上幼儿园了,这样可不行,妈妈锻炼我要学会自己穿衣服。   有一天,妈妈把衣服摆在我面前,开始让我自己穿。一开始。我又哭又叫就是不穿,还把衣服扔的满地都是,然后坐在地上开始大哭,等了好长时间,妈妈还是不理我,我只好自己乖乖的把衣服穿好, 一出了房间门,妈妈就笑了起来,再看看我的衣服,毛衣和裤子都穿反了,我赶紧回房间又重新穿了一遍,这次穿好了,拿起外套,可是外套的扣子又扣不上了,扣子可调皮了,好像故意和我作对,我把扣子往扣眼——人类邪恶的根源;爱情——幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话:亲爱的!擦干你的眼泪,至高无上的爱情已经打开了我们的眼界,使我们成了它的崇拜者。是它,


你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可


最后,国庆福利来了,我们的知识星球已达到1000人了,之前说过到达1000人时将大大幅涨价到169元,为了反馈大家对我们的关注和厚爱,特此维持现价99元最后一天,今天后(今晚 00:00)后将涨到169元,欢迎大家加入我们的知识星球,更多星球信息参见:

如何进阶成为Java和Android架构师?

金九银十跳槽季如何进阶找到合适满意的工作?

说两件事

640?wx_fmt=jpeg

微信扫描或者点击上方二维码领取Android\Python\AI\Java等高级进阶资源

更多学习资料点击下面的“阅读原文”获取

640?wx_fmt=gif

猜你喜欢

转载自blog.csdn.net/xJ032w2j4cCjhOW8s8/article/details/86610521