得到、微信、美团、爱奇艺APP组件化架构实践
一、背景
随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多。此过程中,你是否有过以下烦恼?
- 项目模块多且复杂,编译一次要5分钟甚至10分钟?太慢不能忍?
- 改了一行代码 或只调了一点UI,就要run整个项目,再忍受一次10分钟?
- 合代码经常发生冲突?很烦?
- 被人偷偷改了自己模块的代码?很不爽?
- 做一个需求,发现还要去改动很多别人模块的代码?
- 别的模块已实现的类似功能,自己要用只能去复制一份代码再改改?
- “这个不是我负责的,我不管”,代码责任范围不明确?
- 只做了一个模块的功能,但改动点很多,所以要完整回归测试?
- 做了个需求,但不知不觉导致其他模块出现bug?
如果有这些烦恼,说明你的项目需要进行 组件化 了。
二、组件化介绍 — 优势及架构
组件化,去除模块间的耦合,使得每个业务模块可以独立当做App存在,对于其他模块没有直接的依赖关系。 此时业务模块就成为了业务组件。
而除了业务组件,还有抽离出来的业务基础组件,是提供给业务组件使用,但不是独立的业务,例如分享组件、广告组件;还有基础组件,即单独的基础功能,与业务无关,例如 图片加载、网络请求等。这些后面会详细说明。
组件化带来的好处 就显而易见了:
- 加快编译速度:每个业务功能都是一个单独的工程,可独立编译运行,拆分后代码量较少,编译自然变快。
- 提高协作效率:解耦 使得组件之间 彼此互不打扰,组件内部代码相关性极高。 团队中每个人有自己的责任组件,不会影响其他组件;降低团队成员熟悉项目的成本,只需熟悉责任组件即可;对测试来说,只需重点测试改动的组件,而不是全盘回归测试。
- 功能重用:组件 类似我们引用的第三方库,只需维护好每个组件,一建引用集成即可。业务组件可上可下,灵活多变;而基础组件,为新业务随时集成提供了基础,减少重复开发和维护工作量。
下图是我们期望的组件化架构:
- 组件依赖关系是上层依赖下层,修改频率是上层高于下层。
- 基础组件是通用基础能力,修改频率极低,作为SDK可共公司所有项目集成使用。
- common组件,作为支撑业务组件、业务基础组件的基础(BaseActivity/BaseFragment等基础能力),同时依赖所有的基础组件,提供多数业务组件需要的基本功能,并且统一了基础组件的版本号。所以 业务组件、业务基础组件 所需的基础能力只需要依赖common组件即可获得。
- 业务组件、业务基础组件,都依赖common组件。但业务组件之间不存在依赖关系,业务基础组件之间不存在依赖关系。而 业务组件 是依赖所需的业务基础组件的,例如几乎所有业务组件都会依赖广告组件 来展示Banner广告、弹窗广告等。
- 最上层则是主工程,即所谓的“壳工程”,主要是集成所有的业务组件、提供Application唯一实现、gradle、manifest配置,整合成完备的App。
三、组件化开发的问题点
我们了解了组件化的概念、优点及架构特点,那么要想实施组件化,首先要搞清楚 要解决问题点有哪些?
核心问题是 业务组件去耦合。那么存在哪些耦合的情况呢?前面有提到过,页面跳转、方法调用、事件通知。 而基础组件、业务基础组件,不存在耦合的问题,所以只需要抽离封装成库即可。 所以针对业务组件有以下问题:
- 业务组件,如何实现单独运行调试?
- 业务组件间 没有依赖,如何实现页面的跳转?
- 业务组件间 没有依赖,如何实现组件间通信/方法调用?
- 业务组件间 没有依赖,如何获取fragment实例?
- 业务组件不能反向依赖壳工程,如何获取Application实例、如何获取Application onCreate()回调(用于任务初始化)?
最近小编有幸在字节跳动高工手里扒到这份“组件化实战学习手册”,这位大佬主导开发过多个采用组件化架构的APP项目。现在我只想吹爆!这位大佬熬夜半个月,把积累的经验和踩的坑都进行了总结,整理成了长达220页的学习手册,手册中收录了大厂热门的组件化项目实战,从新手到架构师,这份学习手册足以。
第一章 Android组件化初识
- 组件化和模块化的区别
- 组件化和插件化的区别
- 组件化开发的优势
- 业务逻辑层
- 组件化开发要遇到的问题
- 从组件化实战来解决问题
- Android组件化基础
……
第二章 Android组件化初探目录
- 组件化演示案例
概述
模块化和组件化
组件化Demo
组件application和library动态切换
…… - WanAndroid APP 组件化项目实战附demo
版本更新
效果图
主要功能
项目目录结构
主要开源框架
……
第三章 架构演化(大厂篇)
- 从智行 Android 项目看组件化架构实践
组件化调整的原因和目标
组件化架构调整的整体规划
组件化架构调整中遇到的一些问题
- 得到 App
Android彻底组件化demo发布
JIMU使用指南
组件化拆分的感悟
……
- 微信 App
微信Android模块化架构重构实践
微信Android架构历史
为何再次重构微信
……
蘑菇街 App
蘑菇街 App 的组件化实现方式
组件生命周期管理
壳工程
遇到的问题
持续集成
周边设施
……
爱奇艺 App
基于Service的IPC通信
组件化跨进程通信的核心诉求
Andromeda
架构分析
……
- 美团 App
外卖客户端容器化架构的演进
美团外卖容器化架构全景图
外卖跨端容器建设
外卖页面容器建设
外卖容器化架构的衡量指标
外卖容器化架构的监控运维
外卖容器化架构的发布能力
……
- 美团Android组件化方案及组件消息总线modular-event实战
- 美团Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
- WMRouter:美团外卖Android开源路由框架
- 美团猫眼android模块化实战-可能是最详细的模块化实战
- 携程App
- 支付宝 App
…
由于篇幅限制,这里只能展示部分内容,朋友们如果需要这份完整版的PDF资料合集,微信扫描下方CSDN官方二维码【免费获取
】。
结语
现在组件化真的不是什么新鲜东西了,大公司都用的滚瓜烂熟,龙飞凤舞了,也就是现在部分中型项目和小项目在组件化的路上努力。
所以同志们,组件化没玩过的,不熟悉的赶紧搞起来,说一点,你不会组件化,发布影子工程那么对你来说就是个噩梦。从本质上来讲任何技术进步都是在现实需求的逼迫下抓耳挠腮,耗尽无数头发才想出来的。
所以呢组件化这个东西出来这么久了,页发展了这么久了,用的人越来越多,那肯定是对我们开发大有裨益的,小伙伴们不会,不熟悉抓紧啦,要不面试问你你怎么回答呢!
得到、微信、美团、爱奇艺APP组件化架构实践相关推荐
- 效能篇 | 爱奇艺APP一键体检技术实践
背景 AndroidAPP自动化测试目前包括很多测试专项,每一个专项都有很多创新内容,包括功能自动化测试.稳定性自动化测试以及性能自动化测试等,在日常的测试过程中以上的测试技术或者服务均会发现一些问题 ...
- 爱奇艺号微前端架构实践
前言 近来,微前端的概念非常火爆,那么什么是微前端架构?微前端架构是一种架构风格类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应 ...
- 爱奇艺APP的自动化录制回放系统 全云化处理新体验
在面对大量的APP功能用例回归测试的时候,测试开发工程师最头痛的问题之一便是新功能交付时间紧迫,原有功能回归测试耗时长,自动化脚本都没时间跟进补齐测试用例.导致核心功能回归遗漏,新功能测试质量也得不到 ...
- Android篇 | 爱奇艺App启动优化实践分享
导读 性能优化一直都是各个APP推进中的重点.难点,爱奇艺 App也不例外.在此之前,爱奇艺App Android 版的启动速度虽然一直处于同类App领先的水平,但优势距离其他同类的APP距离一直很小 ...
- 腾讯技术团队人手一份的Android组件化实战笔记(含得到、微信、美团、爱奇艺APP架构项目及源码)
前言 以前的Android开发大多用的中心化管理思想,将相同的资源集中进行管理.随着项目的发展,弊端渐显:集中管理的资源越来越多,多人开发也越来越麻烦,时常牵一发而动全身. 尤其是在大公司或者是大项目 ...
- 互联网晚报 | 1/12 星期四 | 微信回应切断抖音外链;爱奇艺App限制投屏;iPhone 16 Pro或取消灵动岛摄像头...
微信回应切断抖音外链:坚决打击给用户造成诱导.骚扰的外链 1月10日晚间,第一财经独家报道抖音链接目前在微信内既无法直接打开.也无法复制完成跳转,甚至要通过图片OCR识别进行文字提取的情况.但微信内 ...
- 爱奇艺 App 中台技术实践
本文来自爱奇艺研究员在 ArchSummit 全球架构师峰会上的演讲整理,将为大家分享爱奇艺打造移动中台的过程.爱奇艺移动中台的建设过程可分为组件解耦.组件定制化和平台化,未来会利用平台发现.沉淀和复 ...
- 没有投屏标志怎么投屏_爱奇艺App没有“TV”图标怎么投屏电视
原标题:爱奇艺App没有"TV"图标怎么投屏电视 爱奇艺App没有"TV"图标怎么投屏电视 其实大家都知道现在的好多APP软件都是可以无线投屏的,比如爱奇艺,腾 ...
- 爱奇艺APP全面适配iOS 14 首批支持画中画功能 追剧聊天两不误
导 语 为了让iOS 14的用户娱乐体验有更加舒适.便捷,爱奇艺APP全面适配iOS 14,不仅是首批支持iOS 14一屏多任务画中画功能的平台,同时支持Widget小组件实现桌面个性化推荐一键点击 ...
最新文章
- PXE自动化安装系统
- 用IIS建立的.net网站通过IP地址不能访问解决方法
- 一种c#深拷贝方式完胜java深拷贝(实现上的对比)
- 线性代数行列式计算之迭代法
- leetcode 686. Repeated String Match | 686. 重复叠加字符串匹配(KMP)
- php --魔术常量 /魔术方法
- 算法设计中的基础常用代码
- 笔记本电脑怎么清理灰尘_笔记本发热怎么办?这里有解决方案
- mysql 清理 reley_MySQL日志相关
- 信息学奥赛一本通 1146:判断字符串是否为回文 | OpenJudge NOI 1.7 33:判断字符串是否为回文
- win10怎么设置默认浏览器_vscode如何设置默认打开的浏览器为Chrome?
- 数据操作类:增删改查
- 怎么用EasyRecovery恢复sd卡中的数据
- python for 循环中使用星号(*),实现分组展开列表
- 极光im php,利用php+curl调用极光IM第三方REST API方法经验
- 微星主板Ubuntu16.04安装教程
- python代码案例详解-Python代码样例列表
- 数据库实验1---创建数据库和表
- web浏览器下载文件没响应不报错
- 干货 | 携程机票Sketch插件开发实践