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 和组件通信用的 InterfaceEvent。有需要引用这些类的组件只要依赖 API 即可。比如:

  • template :组件代码,它包含了这个组件所有业务代码;

  • template-api:组件的接口模块,专门用于与其他组件通信,只包含 ModelInterfaceEvent,不存在任何业务和逻辑代码。

2. 组件工程半自动拆分

解耦拆组件是一个很头疼的问题,如果依赖关系比较复杂,很容易出现到处编译错误,只能靠人肉一点点挪了。为了解决这个问题,知乎开发了一个辅助工具 RefactorMan: 它可以递归的解析出工程中所有源码的引用和被引用情况,同时会根据预设规则自动分析出所有不合理的依赖,在开发人员根据提示解决了不合理依赖之后,即可将组件一键移出,大大减少了拆组件的工作量。

3. 联合编译完整包

通过 sourceSet 整合资源的目录,编译时使用 sourceSet 依赖,其他时候使用 module 依赖,保证各个子业务可以独立运行,对外发布只有一个组件。

新的架构图:

它包含 4 个层次:

  • 主工程:除了一些全局配置和主 Activity 之外,不包含任何业务代码。

  • 业务组件:最上层的业务,每个组件表示一条完整的业务线,彼此之间互相独立。

  • 基础组件:支撑上层业务组件运行的基础业务服务。

  • 基础 SDK:完全业务无关的基础代码。

2.3 爱奇艺知识移动端组件化探索和实践

组件化对于任何一个业务场景复杂的 App 来说都是一个必经的过程,随着公司的业务线拆分发展,必然会出现同样的业务模块出现多端多套代码的情况,造成很大的维护成本。在实施组件化之前,先明确组件化需要解决的业务问题,而不是为了组件化而组件化。

在爱奇艺知识移动端实施组件化时,组件化的目标定义为以下几个:

  • 解决多端代码维护问题

根据业务特点,横向和纵向划分组件,以组件为单位承接迭代需求,各端进行组件复用。

  • 解决跨组件调用和组件间路由的问题

业务划分更加清晰、组件间解耦更加彻底、组件间通信更高效,对原有业务模块进行抽离和整合,明确组件间的业务边界。

  • 提升开发效率,方便开发调试

组件可以单独编译和调试,使模块开发者更聚焦本模块业务。

  • 提升集成和提测效率

各端项目需要哪个组件,可以直接通过工具快速集成和提测。

基于以上四个目标,结合自己的业务需求,新的架构分为基础组件、功能组件和业务组件

aiqiyi.png

其次是关于组件化实践中比较核心的两个技术点实践:组件间交互和组件间路由。

组件间交互

组件间交互的难点是降低组件耦合度,最好能达到完全无侵入式的调用。在 Android 端,组件间交互使用的是 ZRouter 组件,每个组件对外提供一个服务接口 service,接口的实现交给对应组件内。在组件初始化注册时候,会同时注册该 service 接口和对应 service 实现。业务方使用时,只需要通过 service 接口调用组件功能。这样组件间就没有了直接依赖关系,实现了组件间解耦隔离。

组件间路由

组件间路由跳转方面,用了注册 URL 的方式,注册的时机分为静态、动态和懒加载三种,懒加载方式即为在调用跳转方法时检查 URLClassName 是否已经注册绑定,如果未绑定则从模块静态信息表中获取并完成注册绑定。这里爱奇艺团队借鉴业内优秀的组件化思想,专门开发了一个用于组件间UI跳转的 UIRouter

3. 实现组件化

3.1 四大步骤实现组件化

通过上面一些优秀案例的分析,当一个组织进行架构重构和调整时,基本上是积重难返、严重影响开发效率。所以需要对架构进行重构,提升开发效率。结合以上案例,总结出四大步骤来辅助我们实现一个组件化架构的设计。

1. 明确组件化的目的

任何架构的重构或调整,都是为了解决特定的问题,在实施组件化之前,一定要明确此次架构重构需要解决的问题,以便能够有的放矢,而不是为了组件化而组件化。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
片转存中…(img-uyhSDGu3-1712709822558)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-w9uMz5QM-1712709822558)]

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐