首页 > 其他分享 >得到、微信、美团、爱奇艺APP组件化架构实践

得到、微信、美团、爱奇艺APP组件化架构实践

时间:2023-06-19 11:01:33浏览次数:41  
标签:依赖 架构 爱奇艺 微信 APP 业务 组件 Android App


一、背景

随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多。此过程中,你是否有过以下烦恼?

  • 项目模块多且复杂,编译一次要5分钟甚至10分钟?太慢不能忍?
  • 改了一行代码 或只调了一点UI,就要run整个项目,再忍受一次10分钟?
  • 合代码经常发生冲突?很烦?
  • 被人偷偷改了自己模块的代码?很不爽?
  • 做一个需求,发现还要去改动很多别人模块的代码?
  • 别的模块已实现的类似功能,自己要用只能去复制一份代码再改改?
  • “这个不是我负责的,我不管”,代码责任范围不明确?
  • 只做了一个模块的功能,但改动点很多,所以要完整回归测试?
  • 做了个需求,但不知不觉导致其他模块出现bug?

如果有这些烦恼,说明你的项目需要进行 组件化 了。

二、组件化介绍 — 优势及架构

组件化去除模块间的耦合,使得每个业务模块可以独立当做App存在,对于其他模块没有直接的依赖关系。 此时业务模块就成为了业务组件

而除了业务组件,还有抽离出来的业务基础组件,是提供给业务组件使用,但不是独立的业务,例如分享组件、广告组件;还有基础组件,即单独的基础功能,与业务无关,例如 图片加载、网络请求等。这些后面会详细说明。

组件化带来的好处 就显而易见了:

  1. 加快编译速度:每个业务功能都是一个单独的工程,可独立编译运行,拆分后代码量较少,编译自然变快。
  2. 提高协作效率:解耦 使得组件之间 彼此互不打扰,组件内部代码相关性极高。 团队中每个人有自己的责任组件,不会影响其他组件;降低团队成员熟悉项目的成本,只需熟悉责任组件即可;对测试来说,只需重点测试改动的组件,而不是全盘回归测试。
  3. 功能重用:组件 类似我们引用的第三方库,只需维护好每个组件,一建引用集成即可。业务组件可上可下,灵活多变;而基础组件,为新业务随时集成提供了基础,减少重复开发和维护工作量。

下图是我们期望的组件化架构

得到、微信、美团、爱奇艺APP组件化架构实践_android

  1. 组件依赖关系是上层依赖下层,修改频率是上层高于下层。
  2. 基础组件是通用基础能力,修改频率极低,作为SDK可共公司所有项目集成使用。
  3. common组件,作为支撑业务组件、业务基础组件的基础(BaseActivity/BaseFragment等基础能力),同时依赖所有的基础组件,提供多数业务组件需要的基本功能,并且统一了基础组件的版本号。所以 业务组件、业务基础组件 所需的基础能力只需要依赖common组件即可获得。
  4. 业务组件业务基础组件,都依赖common组件。但业务组件之间不存在依赖关系,业务基础组件之间不存在依赖关系。而 业务组件 是依赖所需的业务基础组件的,例如几乎所有业务组件都会依赖广告组件 来展示Banner广告、弹窗广告等。
  5. 最上层则是主工程,即所谓的“壳工程”,主要是集成所有的业务组件、提供Application唯一实现、gradle、manifest配置,整合成完备的App。

三、组件化开发的问题点

我们了解了组件化的概念、优点及架构特点,那么要想实施组件化,首先要搞清楚 要解决问题点有哪些?

核心问题是 业务组件去耦合。那么存在哪些耦合的情况呢?前面有提到过,页面跳转、方法调用、事件通知。 而基础组件、业务基础组件,不存在耦合的问题,所以只需要抽离封装成库即可。 所以针对业务组件有以下问题:

  1. 业务组件,如何实现单独运行调试?
  2. 业务组件间 没有依赖,如何实现页面的跳转?
  3. 业务组件间 没有依赖,如何实现组件间通信/方法调用?
  4. 业务组件间 没有依赖,如何获取fragment实例?
  5. 业务组件不能反向依赖壳工程,如何获取Application实例、如何获取Application onCreate()回调(用于任务初始化)?

最近小编有幸在字节跳动高工手里扒到这份“组件化实战学习手册”,这位大佬主导开发过多个采用组件化架构的APP项目。现在我只想吹爆!这位大佬熬夜半个月,把积累的经验和踩的坑都进行了总结,整理成了长达220页的学习手册,手册中收录了大厂热门的组件化项目实战,从新手到架构师,这份学习手册足以。

得到、微信、美团、爱奇艺APP组件化架构实践_Android_02

第一章 Android组件化初识

  • 组件化和模块化的区别
  • 组件化和插件化的区别
  • 组件化开发的优势
  • 业务逻辑层
  • 组件化开发要遇到的问题
  • 从组件化实战来解决问题
  • Android组件化基础
    ……

得到、微信、美团、爱奇艺APP组件化架构实践_组件化_03

第二章 Android组件化初探目录

  • 组件化演示案例
    概述
    模块化和组件化
    组件化Demo
    组件application和library动态切换
    ……
  • WanAndroid APP 组件化项目实战附demo
    版本更新
    效果图
    主要功能
    项目目录结构
    主要开源框架
    ……

得到、微信、美团、爱奇艺APP组件化架构实践_Android_04

第三章 架构演化(大厂篇)

  • 从智行 Android 项目看组件化架构实践
    组件化调整的原因和目标
    组件化架构调整的整体规划
    组件化架构调整中遇到的一些问题

得到、微信、美团、爱奇艺APP组件化架构实践_App_05

  • 得到 App
    Android彻底组件化demo发布
    JIMU使用指南
    组件化拆分的感悟
    ……

得到、微信、美团、爱奇艺APP组件化架构实践_App_06

  • 微信 App
    微信Android模块化架构重构实践
    微信Android架构历史
    为何再次重构微信
    ……

得到、微信、美团、爱奇艺APP组件化架构实践_App_07

  • 蘑菇街 App
    蘑菇街 App 的组件化实现方式
    组件生命周期管理
    壳工程
    遇到的问题
    持续集成
    周边设施
    ……
  • 得到、微信、美团、爱奇艺APP组件化架构实践_组件化_08

  • 爱奇艺 App
    基于Service的IPC通信
    组件化跨进程通信的核心诉求
    Andromeda
    架构分析
    ……

得到、微信、美团、爱奇艺APP组件化架构实践_android_09

  • 美团 App
    外卖客户端容器化架构的演进
    美团外卖容器化架构全景图
    外卖跨端容器建设
    外卖页面容器建设
    外卖容器化架构的衡量指标
    外卖容器化架构的监控运维
    外卖容器化架构的发布能力
    ……

得到、微信、美团、爱奇艺APP组件化架构实践_android_10

  • 美团Android组件化方案及组件消息总线modular-event实战
  • 美团Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
  • WMRouter:美团外卖Android开源路由框架
  • 美团猫眼android模块化实战-可能是最详细的模块化实战

得到、微信、美团、爱奇艺APP组件化架构实践_组件化_11

  • 携程App
  • 支付宝 App

标签:依赖,架构,爱奇艺,微信,APP,业务,组件,Android,App
From: https://blog.51cto.com/u_16163452/6511742

相关文章

  • Welcome To Learn Dapper
    WelcomeToLearnDapperThissiteisfordeveloperswhowanttolearnhowtouseDapper-ThemicroORMcreatedbythepeoplebehind StackOverflow.WhatisDapper? Dapperisanopen-sourceobject-relationalmapping(ORM)libraryfor.NETand.NETCore......
  • Appium的三种等待机制
    appium三种等待方式:  (1)强制等待  (2)隐式等待  (3)显式等待 三种等待方式之间的区别: 1、强制等待使用方式:time.sleep()强制执行对应的等待时间后,才能执行下面的操作语句,影响脚本运行的速度,一般不推荐 2、隐式等待使用方式:driver.imolicitly_wait()相对于强制......
  • call 和 apply有什么区别
    call和apply都是function原型上的方法,每一个函数作为function的实例都可以调用这两个方法,这两个方法的目的都是改变函数的this指向并且让函数执行的。唯一的区别就是call时需要一个个传参数,而apply时将参数以数组的形式进行传递。......
  • CSAPP读书笔记(第1章)
    编译Hollow程序: gcc-ohellohello.c四阶段的编译系统: 运行hello程序:./hello     这里的点代表啥? 上级吗 ......
  • uniapp怎么关闭侧滑
    uniapp全局禁止侧滑首先找到并打开“manifest.json”,然后配置内容为“"popGesture":"none"”即可禁止响应左滑动画。"plus":{//uni-app项目对应节点名称为"app-plus""popGesture":"none"}uniapp单页面禁止侧滑返回(NVUE)//#ifdefAPP-PLUSletpa......
  • Hadoop的mapper和reducer的个数如何确定?reducer的个数依据是什么?
    参考答案:map数量影响map个数(split个数)的主要因素有:文件的大小。当块(dfs.block.size)为128m时,如果输入文件为128m,会被划分为1个split;当块为256m,会被划分为2个split。文件的个数。FileInputFormat按照文件分割split,并且只会分割大文件,即那些大小超过HDFS块的大小的文件。如果HDFS中dfs......
  • 微信小程序更改刷新data 数组结构里的某一项数据
    如果每次setData 中list整个数组,感觉会消耗性能,所以只需要setData刷新对应的item  只需要通过以下方式解决    this.setData({'array[0].text':'updatedata'})//如果索引是动态的则使用下方方式varmMessage='array['+index+'].text';this.set......
  • PC微信版本号修改
    一、准备工具1.PC版微信2.CheatEngine二、修改步骤1.以3.9.5.81为例,分成4段,就是:39581,再将这些数值转换为16进制。3=>3、9=>9、5=>5、81=>51,其中小数点用0表示。2.将转换后的数值拼接起来:6+30+90+551=63090551。3.打开CE搜索63090551。 4.然后修改结果的数值即可......
  • nrf52832学习-app_timer模块
    简单使用:app_timer是模块,使用时需要在sdk_config.h文件中将其使能添加头文件app_timer.h定义Timer定时器唯一识别号_my_timer_id和需要的定时时间常量MY_TIMER_INTERVALAPP_TIMER_DEF(_my_timer_id);#defineMY_TIMER_INTERVALAPP_TIMER_TICKS(_milliseconds)......
  • .Net6 增加AutoMapper自动映射
    概述1、什么是AutoMapper简单来说,AutoMapper就是一个用C#语言开发的一个轻量的处理一个实体对象到另外一个实体对象映射关系的组件库官网地址:AutoMapper文档地址:AutoMapper—AutoMapperdocumentation 2、为什么要用AutoMapper层与层之间的......