1. 组件化与模块化
组件化
组件是指单一的功能组件。比如视频组件、支付组件。在实际组件化的过程中,每个组件都是一个单独的 Module
,每个 Module
可作为独立的 Application
运行,也可作为单独的 Library
运行。
模块化
模块是指独立的业务模块,比如支付模块、登录模块。在 AndroidStudio 中,一个模块同样对应着一个 Module
,模块化就是将业务拆分成不同的 Module
模块,模块之间通过相互依赖的方式进行调用与通信。
从架构层面来说,二者的核心思想都是分而治之,都是为了提升代码的质量和可维护性,但是差别是在划分的粒度上,模块的粒度比组件的粒度高,通常情况一个模块中可能包含多个组件。
组件化是纵向分层,模块化是横向分块。
组件化的优点
-
提高开发效率:通过组件化的解耦,降低各个组件之间的相互依赖,使每个组件都是高内聚低耦合的状态。单独某个组件的修改不会对其它组件有重大影响,对于开发和测试来说,都提高了工作效率。同时可维护性也极大提升。
-
功能复用:每个单独的组件就是一个单一功能,对于业务线的开发团队来说,通过直接使用组件快速完成功能开发,同时减少了重复的开发工作量。
2. 组件化案例
在这部分,主要是结合网上一些优秀团队分享的组件化方案进行剖析。
2.1 有赞微商城 Android 组件化
有赞微商城分享的组件化方案详细介绍了实施组件化方案的背景,在基于日益复杂的业务模块中,代码出现大量冗余、打包时间逐渐增长以及各个业务模块之间相互耦合等。面临的问题有:
-
模块只是项目结构的概念(一个模块一个
Module
),在逻辑层并没有模块这个概念 -
模块本身没有生命周期控制
-
公用服务中心化,公用逻辑部分全部都在
Common
模块中 -
模块对外暴露的服务不可知,都是直接依赖模块内部的代码逻辑
-
模块无法单独打包,针对模块的代码改动,只能全量打包之后才能看到效果
这些问题也是很多项目发展到一定阶段要面对的问题,为了解决这种问题,就需要对架构进行调整重构,严格按照组件化的强要求来进行业务模块的拆分。下面我们看下有赞团队是如何去落地组件化方案。
1. 模块的拆分与抽象
将模块的功能抽象出基础类,形成模块化支持组件,这个基础 Module
提供的功能有:
-
抽象出模块本身作为某一类业务的容器,即所有业务模块需要实现自己的模块类,继承自我们的
BaseModule
,并在App
壳工程中进行注册; -
模块对象跟
Activity
一样,拥有生命周期的概念,需要在生命周期的不同阶段处理自己相应的逻辑(注册服务、初始化数据等); -
模块可以注册的对外暴露的服务的实现,在注册模块的时候,模块携带的服务也会被注册到 App 的服务中心。
2. 公共业务去中心化
这里的公共业务是指在 App
中抽取的 Common
模块,这个模块随着项目复杂度的提升,像一个大储物柜,每个人都往里面塞了很多业务代码,造成了该模块代码冗余增多以及维护难度增大。解决思路是:
-
将公用的业务模块向上抽离到业务模块中(所谓业务模块的服务化);
-
将基础组件抽象到一个独立的组件中;
-
将一些基础类下沉到不包含业务逻辑的底层核心库中。
3. 业务模块服务化
简单来说,就是根据业务划分为多个模块,模块之间的交互以互相提供服务的方式来完成。常见的基本方式有:
-
A
模块直接依赖B
模块,直接调用B
模块的代码逻辑; -
将
A
和B
模块中的公用部分放到Common
模块中,通过调用Common
模块的代码实现依赖;
在有赞的组件化中,提出了通过 API
的方式实现,每个模块通过 API
暴露内部的数据和服务,以此来完成通信。常见的 API 实现方式有:
-
协议,类似于
app://order/detail/get?id=100
,通过JSON
传递数据,但是面临的问题维护成本高,服务修改导致引用方无感知; -
接口,通过暴露的接口完成数据的交互,引用方需要依赖该模块,依赖和发布成本高;
这里有赞团队选择通过接口的方式实现,这种方式的稳定性和版本控制做的更好,对于改动来说,编译过程自动会帮你校验改动的影响面,而引入依赖和发布成本高的问题,完全可以交给构建工具(Gradle Plugin
)来解决。
业务实现层需要做的,就是实现自己模块本身的业务逻辑,并实现自己提供的 API
接口,暴露对外的服务。
4. 基础组件抽象
很多的基础组件都是统一在 Common
里面进行封装的,例如:账号库、网络库、图片加载等等,导致该模块臃肿。针对这种情况,需要针对该模块进行重构:
-
将常用的基础组件整理,抽象成单独的一个抽象层,里面定义了一系列基础组件接口(图片加载、
Web
容器、JsBridge
调用、账号等等); -
把统一实现的组件放到另一个依赖里面,可以在
App
中进行具体实现的注册,而业务模块本身,可以只依赖抽象。
5. 单/多模块打包
这部分是通过自定义 Gradle Plugin
实现 Module
的类型,在开发阶段是 Application
类型,可以单独运行调试,在发布阶段是 Library
形式。
新的架构图:
2.2 知乎 Android 客户端组件化实践
在知乎 Android 客户端组件化实践一文中,介绍到随着项目团队的不断扩大,同样是面临代码耦合的问题以及现有架构在开发过程中研发人员协作方面也显得越来越力不从心。下面我们看下知乎团队如何落地实践组件化。
1. 解耦业务模块
组件化第一步就是要解耦冗余的业务逻辑,这里主要包含:
公有代码处理
基础的业务逻辑拆分出独立的业务组件,将 Common
模块进行降级处理,严格限制大小增长。
初始化
有些组件有在应用启动时初始化服务的需求时,通过自定义生命周期框架进行实现初始化任务依赖和先后顺序的管理。
路由
界面间使用 Url
进行跳转,内部实现了一套灵活小巧的路由框架 ZRouter
完成路由跳转功能。
接口
不同业务之间不可避免的会有一些调用,为了避免组件的直接通信,通常都是使用接口依赖的方式。实现了一个 Interface Provider
来支持接口通信,它可以通过运行时在动态注册一个接口,同时也实现了对于 ServiceLoader
的支持。
组件 API 模块
为每个有对外暴露需求的组件添加一个 API
模块,API
模块中只包含对外暴露的 Model
和组件通信用的 Interface
与 Event
。有需要引用这些类的组件只要依赖 API
即可。比如:
-
template
:组件代码,它包含了这个组件所有业务代码; -
template-api
:组件的接口模块,专门用于与其他组件通信,只包含Model
、Interface
和Event
,不存在任何业务和逻辑代码。
2. 组件工程半自动拆分
解耦拆组件是一个很头疼的问题,如果依赖关系比较复杂,很容易出现到处编译错误,只能靠人肉一点点挪了。为了解决这个问题,知乎开发了一个辅助工具 RefactorMan
: 它可以递归的解析出工程中所有源码的引用和被引用情况,同时会根据预设规则自动分析出所有不合理的依赖,在开发人员根据提示解决了不合理依赖之后,即可将组件一键移出,大大减少了拆组件的工作量。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的Android开发中高级必知必会核心笔记,共计2968页PDF、58w字,囊括Android开发648个知识点,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。
虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。
虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Na88lVtT-1712709852841)]