模块 :指具体的业务逻辑模块,比如微信主页的四个页面,我们就可以定义为四个模块,由于模块的对象是业务,所以比组件的广度来讲要大许多,因为随着他的业务进展,他会包含越来越多的组件。

 :单一职责的提供某个或者某些功能。

有了这些概念,就会诞生出很多的抽象名称,比如组件化,模块化,插件化等,追源溯本你会发现,其实他们的出发点,都是为了架构的不断演进而努力,只是趋向于目标不一致,所以文章开头我才说MVC,MVP之类的是针对代码的解耦,也就是让代码看得更加的清晰,一个View中实现一个Presenter后单一职责即可,但是组件化就不一样,他是针对业务模块进行区分,并且它也算是海纳百川,你具体代码怎么写,他也不负责,他维护好更大的框架即可。

其实说白了,就是将业务多Module的分层,比如大家常常用微信来举例子,微信有四个Tab,分别是:微信,通讯录,发现,我,那么我们是不是可以将其分成四个Module呢?

的确是的,如图:

从图中可以看到,App作为一个UI的基础空壳,他将主页的逻辑实现即可,然后则是引入四个Module,他们都将依赖BaseModule,而BaseModule纯粹就是一个Library,主要封装一些工具类,管理类,和帮助类,我们的组件化历程则是从四个Module开始,他们既可以作为Module存在让App互相调用,又可以作为App单独存在调试,假设组内五个人开发,刚好可以让组长负责App和BaseModule,而其余四人分别负责微信,联系人,发现,我,即可,分工明确。

那么我们现在分工是明确了,如何在Android Studio中搭建组件化,则又是另外一回事儿了,既要考虑到App作为单独存在时的配置,也要考虑合并时主程序的运行。所以困难的一点在于如何初始化这个组件化项目的基础上,那么我们来开始搭建吧。

二.组件化项目


1.开发思路

我们既然要创建一个组件化的项目,那么首先就必须理清楚开发思路,首当其冲就是组件间的跳转,由于组件之间并没有直接的依赖关系,那么startActivity显然是无法使用了,这个时候我们可以使用阿里的Arouter来实现跳转:

ARouter

紧接着就是合并问题了,我们可以定义一个自定义的Gradle文件来控制是否Module单独编译。

其次就是注解了,说实话,注解的帮助还是很大的,至少我们少了很多的findViewById,我们可以使用Butterknife黄油刀来实现初始化,不过这个是选学,可以选择性添加,不添加也不碍事。

Butterknife

那么回到问题的根本,开发思路就是如此,先构建好每个Module的Gradle文件,然后再来统筹,不过这些都是给予一个完整的App Module来实现的,想单一的运行Module为Apk,我们至少还需要单独创建一个Activity作为启动项,以及一个清单文件作为配置项才行。

那么我们开始吧…

2.创建Module

首先我们创建五个Module,只要点击 File - New - New Module - Android Library 即可,以此类推,我们分别创建 :

  • ChatModule

  • ContactModule

  • FindModule

  • MeModule

  • BaseModule

分别对应的是微信,联系人,发现,我和基类。

3.自定义Gradle

我们在Project的根目录创建一个config.gradle来统筹我们的依赖和版本信息

里面比较关键的还是我们配置的 IS_BUILD_MODULE 变量,如果可以设置当为true的时候,Module可以单独运行,即Application,如果为false,那么我们就只能让Module作为Library来执行,至于其他的,都是一些普通的配置。

IS_BUILD_MODULE 这个开关还可以放在gradle.properties中,实际上我觉得放在gradle.properties会更好,这样对Git提交也不会在不严谨的时候造成代码冲突,不过既然团队已经在构建组件化,想必技术选型也其实早就配置好了,那么该用到哪些框架,也都提前配置好了,倒不会引起太大的骚乱。

4.主App配置

主App的配置主要集中于如何添加依赖,不管是组件Module还是BaseModule,都是一个过程

[图片上传失败…(image-aa2eb4-1607329172143)]

我们可以看到,BaseModule的添加是必然的,其次就是四个组件了,四个组件我们通过判断IS_BUILD_MODULE这个值来确定是否添加,下面是ARouter和Butterknife的添加,这两个比较特殊,所以才每个build.gradle都要添加,而普通的依赖项,我们只需要在BaseModule中添加即可。

而其他要关注的点就如下:

我们要添加黄油刀的插件,以及在defaultConfig中加上路由的配置,以及支持Java 8 ,这三个配置在每一个Module中都需要配置。

如果没有添加路由的配置,则无法跳转,如果没有添加Java 8 的支持,则会报错:

Exception from call site #1 bootstrap method

当然,我们配置黄油刀,还需要在Project的build.gradle中配置插件

5.组件的配置

组件的配置在于两方面,一方面是作为依赖,一方面作为一个独立的App

还是先来看下他的build.gradle

[图片上传失败…(image-5b7df3-1607329172143)]

可以看到,这就是他的配置文件,其实很普通,路由和黄油刀的标配,以及添加BaseModule,之后哪怕是添加其他第三方框架也是在BaseModule中配置。当然,正如我们主Module的配置一样,组件Module也需要配置黄油刀的插件,以及在defaultConfig中加上路由的配置,以及支持Java 8 ,这是必然的,除此之外,他有两个特殊的地方:

可以看到,我们会根据我们定义的变量来加载他到底是App还是Module,这样就能做到我们的随意切换了,如果是App的话,我们还需要给他配置一个包名ID,你可以给他设置相同的包名,我这里做了一些小区分而已。

还有一个地方则是清单文件的配置了 [图片上传失败…(image-6b3943-1607329172143)]  sourceSets可以帮助我们替换加载的文件,我们如果是App的话,重新配置了一个清单文件,因为他包含了App所需要的一切,如果是module,则不处理。来看下他们之间的区别:

首先是作为Module的清单文件:

可以看出,他只有必要的四大组件需要配置的时候则配置,不然的话就是空的了

而再看下作为App的清单文件:

他可能比你想象的东西要多,他有一个Application根节点配置App的参数,还需要一个启动项Activity,不然也启动不起来。

6.BaseModule

基类的Module给我们更多的是封装的帮助,我们需要使用到的资源以及第三方框架都是可以放在这里的,老规矩,来看下他的build.gradle

你理解了他,他就变得透明,就是一些常规的添加,并且黄油刀的插件,以及在defaultConfig中加上路由的配置,以及支持Java 8 必不可少。

7.Base类

作为高度统筹的项目架构,在Base方面实际上也是有一定的约束的,这里我以三个类为案例,分别是BaseApp,BaseActivity以及BaseFragment

A.BaseApp

BaseApp方面主要还是做一些初始化的作用,不过你也可以在BaseModule中添加一个统一初始化的方法,BaseApp需要注意的点:

  • 1.组件统一Context可以单例Application

  • 2.组件Module需要继承自BaseApp

最后看一下《Android框架体系架构(高级UI+FrameWork源码)》学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

[外链图片转存中…(img-S9SNniyQ-1643777885378)]

Android 组件化架构概要,熬夜整理Android高频面试题相关推荐

  1. Android 组件化架构概要,ffmpeg音视频开发实战陈超

    ChatModule ContactModule FindModule MeModule BaseModule 分别对应的是微信,联系人,发现,我和基类. 3.自定义Gradle 我们在Project ...

  2. android 组件化架构 读书总结

    <android 组件化架构 >这本书从第五章组件分发开始就已经看得很吃力了,我发现我看得吃力后,我下载了书的源码来看,发现单看源码根本也是看不懂的,然后就结合了书来看,然后证实了我就是菜 ...

  3. Android 组件化架构-简谈

    说在前面: 随着业务的增加,由于单一工程下业务全都集合在主工程下,而导致业务间相互交错的依赖耦合越来越严重,那么就可能出现动一触千的现象,这时候将业务按照功能的不同抽离出来就显得迫在眉睫. 了解组件化 ...

  4. Android组件化架构实践,成功拿下大厂offer

    缘起 经过近十年的发展,Android技术优化日新月异,如今Android 10.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS.到了各大厂商手里,改源码.自定义系统, ...

  5. Android组件化架构实践,全套教学资料

    缘起 经过近十年的发展,Android技术优化日新月异,如今Android 10.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS.到了各大厂商手里,改源码.自定义系统, ...

  6. Android组件化架构实践,字节跳动学习笔记

    前言 2021全年从开头到结尾似乎就没多少好消息.这里我说的是整个互联网行业,并没有单单挑出某个公司或者某个细分领域.而对于广大Android开发者来说,找工作似乎也变得越来越难了. 2021年1月, ...

  7. android组件化架构 书,Android MVVM组件化架构方案

    MVVMHabitComponent 关于Android的组件化,相信大家并不陌生,网上谈论组件化的文章,多如过江之鲫,然而一篇基于MVVM模式的组件化方案却很少.结合自身的调研和探索,在此分享一篇基 ...

  8. 【深夜思考】Android组件化架构实践,成功拿下大厂offer

    (一)简介 Handler机制是一套Android消息传递机制.在Android开发多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实 ...

  9. Android 组件化面试必备(1),Android面试题2020

    如果我们要为某个已经存在的组件,重新开发一个新组件,将变得非常可行. 组件内的重构也将变得非常可行. 新的组件的设计只要保证对外提供的接口,完全符合,旧组件对外提供的接口 5.组件的热插拔,成为可能( ...

最新文章

  1. java中有ClockPane类吗,JavaFX实现简易时钟效果(二)
  2. 【Paper】2012_Design of high performance multimedia control system for UAV/UGV based on SoC/FPGA Core
  3. 边缘提取算子检测比较
  4. 一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式
  5. normalize函数_Pandas 数据处理(一) —— 几个简单函数掌握!
  6. ElasticSearch6.0 Java API 使用 排序,分组 ,创建索引,添加索引数据,打分等(一)...
  7. 华为平板 鸿蒙2.0,华为鸿蒙2.0支持型号有哪些
  8. NC5.X系列单点登录
  9. 计算机硬件对于工作的重要性,计算机硬件日常维护的重要性
  10. 求是量子产业观察:中国量子信息产业发展迅速,初创企业成为新兴力量
  11. @Profile 注解的介绍
  12. 手机计算机怎样可以整分数计算,分数计算器设计
  13. Java 导出富文本到Word(包含图片)
  14. JavaScript:鼠标拖曳效果
  15. php收短信,PHP飞信接收短信类
  16. 7.TensorRT中文版开发教程-----TensorRT中的INT8量化详解
  17. 个人空间的编辑个人资料案例(简单介绍 仅供参考)
  18. 重装linux后没声音,笔记本电脑安装ubuntu系统后外放没有声音 ,耳机正常,三步解决办法...
  19. 2007我的找工作之旅 - 洛丽塔之痒 - 洛丽塔之痒 - 和讯博客
  20. [国家集训队2012]tree(陈立杰)

热门文章

  1. android 程序应用锁,应用锁(com.ushareit.lockit) - 2.2.48_ww - 应用 - 酷安
  2. 会声会影怎么把视频和音频合起来 会声会影下面的轨道不见了
  3. ubuntu linux内核版本>5.15安装usb无线网卡驱动
  4. linux新增mysql用户_linux下mysql创建新的用户的方法
  5. Redis: 一文带你了解AOF日志
  6. 缓存数据库REDIS之二:AOF重写原理
  7. linux - mv
  8. ajax函数返回值,ajax:怎么获得onreadystatechange调用的函数的返回值?
  9. python播放视频视频流_我如何通过Python视频流使Porn效率提高20倍
  10. oracle非聚簇索引,聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Index)