1. 解耦业务模块
组件化第一步就是要解耦冗余的业务逻辑,这里主要包含:
公有代码处理
基础的业务逻辑拆分出独立的业务组件,将 Common
模块进行降级处理,严格限制大小增长。
初始化
有些组件有在应用启动时初始化服务的需求时,通过自定义生命周期框架进行实现初始化任务依赖和先后顺序的管理。
路由
界面间使用 Url
进行跳转,内部实现了一套灵活小巧的路由框架 ZRouter
完成路由跳转功能。
接口
不同业务之间不可避免的会有一些调用,为了避免组件的直接通信,通常都是使用接口依赖的方式。实现了一个 Interface Provider
来支持接口通信,它可以通过运行时在动态注册一个接口,同时也实现了对于 ServiceLoader
的支持。
组件 API 模块
为每个有对外暴露需求的组件添加一个 API
模块,API
模块中只包含对外暴露的 Model
和组件通信用的 Interface
与 Event
。有需要引用这些类的组件只要依赖 API
即可。比如:
-
template
:组件代码,它包含了这个组件所有业务代码; -
template-api
:组件的接口模块,专门用于与其他组件通信,只包含Model
、Interface
和Event
,不存在任何业务和逻辑代码。
2. 组件工程半自动拆分
解耦拆组件是一个很头疼的问题,如果依赖关系比较复杂,很容易出现到处编译错误,只能靠人肉一点点挪了。为了解决这个问题,知乎开发了一个辅助工具 RefactorMan
: 它可以递归的解析出工程中所有源码的引用和被引用情况,同时会根据预设规则自动分析出所有不合理的依赖,在开发人员根据提示解决了不合理依赖之后,即可将组件一键移出,大大减少了拆组件的工作量。
3. 联合编译完整包
通过 sourceSet
整合资源的目录,编译时使用 sourceSet
依赖,其他时候使用 module
依赖,保证各个子业务可以独立运行,对外发布只有一个组件。
新的架构图:
它包含 4 个层次:
-
主工程:除了一些全局配置和主 Activity 之外,不包含任何业务代码。
-
业务组件:最上层的业务,每个组件表示一条完整的业务线,彼此之间互相独立。
-
基础组件:支撑上层业务组件运行的基础业务服务。
-
基础 SDK:完全业务无关的基础代码。
2.3 爱奇艺知识移动端组件化探索和实践
组件化对于任何一个业务场景复杂的 App
来说都是一个必经的过程,随着公司的业务线拆分发展,必然会出现同样的业务模块出现多端多套代码的情况,造成很大的维护成本。在实施组件化之前,先明确组件化需要解决的业务问题,而不是为了组件化而组件化。
在爱奇艺知识移动端实施组件化时,组件化的目标定义为以下几个:
- 解决多端代码维护问题
根据业务特点,横向和纵向划分组件,以组件为单位承接迭代需求,各端进行组件复用。
- 解决跨组件调用和组件间路由的问题
业务划分更加清晰、组件间解耦更加彻底、组件间通信更高效,对原有业务模块进行抽离和整合,明确组件间的业务边界。
- 提升开发效率,方便开发调试
组件可以单独编译和调试,使模块开发者更聚焦本模块业务。
- 提升集成和提测效率
各端项目需要哪个组件,可以直接通过工具快速集成和提测。
基于以上四个目标,结合自己的业务需求,新的架构分为基础组件、功能组件和业务组件。
其次是关于组件化实践中比较核心的两个技术点实践:组件间交互和组件间路由。
组件间交互
组件间交互的难点是降低组件耦合度,最好能达到完全无侵入式的调用。在 Android
端,组件间交互使用的是 ZRouter
组件,每个组件对外提供一个服务接口 service
,接口的实现交给对应组件内。在组件初始化注册时候,会同时注册该 service
接口和对应 service
实现。业务方使用时,只需要通过 service
接口调用组件功能。这样组件间就没有了直接依赖关系,实现了组件间解耦隔离。
组件间路由
组件间路由跳转方面,用了注册 URL
的方式,注册的时机分为静态、动态和懒加载三种,懒加载方式即为在调用跳转方法时检查 URL
与ClassName
是否已经注册绑定,如果未绑定则从模块静态信息表中获取并完成注册绑定。这里爱奇艺团队借鉴业内优秀的组件化思想,专门开发了一个用于组件间UI跳转的 UIRouter
。
3. 实现组件化
3.1 四大步骤实现组件化
通过上面一些优秀案例的分析,当一个组织进行架构重构和调整时,基本上是积重难返、严重影响开发效率。所以需要对架构进行重构,提升开发效率。结合以上案例,总结出四大步骤来辅助我们实现一个组件化架构的设计。
1. 明确组件化的目的
任何架构的重构或调整,都是为了解决特定的问题,在实施组件化之前,一定要明确此次架构重构需要解决的问题,以便能够有的放矢,而不是为了组件化而组件化。
2. 业务拆分
组件化有一个重要的目的是为了降低代码之间的耦合,所以需要根据自己的业务进行拆分。在业务拆分的过程中一般涉及到公共代码的处理、业务模块的拆分。
3. 组件划分
在完成业务拆分后,需要对各个业务形成单一组件,并进行分类。组件的分类大致可以分为:业务组件、功能组件和基础组件三大类。
业务组件
业务组件对应着具体的业务模块,比如首页、搜索、问答。
功能组件
功能组件通常是具有一个完整基础功能的组件,比如分享、视频、播放器等。它通常为业务组件直接引用,用于快速实现特定功能。一般比较稳定。
基础组件
基础组件就是覆盖众多基础功能的组件,这些基础功能和具体的业务无关。比如网络请求、日志框架、图片加载。基础组件是底层最稳定的组件。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
**要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
试中,更是可以帮助我们应对大厂面试官的刁难。
[外链图片转存中…(img-jEjg1ECT-1712709884097)]
[外链图片转存中…(img-YAAnP4Mh-1712709884098)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-C1J35ddC-1712709884098)]