先做一个大分类(最容易混乱的根源)
Android 架构一共分 4 大类,绝大多数开发者都混在一起讲:
- 工程架构(整个项目怎么拆模块) 模块化、组件化、插件化、一体化工程
- 代码分层架构(单个模块内部代码怎么写) MVC、MVP、MVVM、Clean 架构、MVI
- 基础通用架构 单组件内部封装(Base、基类、通用架构)
- 动态化架构 插件化、AppBundle 动态交付、动态组件
我全部逐个详细讲,大白话 + 项目对比 + 面试标准答案。
一、工程架构(项目整体拆分,你之前一直在学的)
就是整个 App 工程怎么拆分 module、模块之间怎么依赖
1. 一体化(单工程)
整个项目就一个 app module,所有代码全写里面。
- 特点:无拆分、耦合极高、编译慢、维护难
- 适用:小 Demo、简单小工具、新手项目
2. 模块化
按功能分层拆多个 library module
模块之间可以互相依赖 ,全部依附主 App,不能独立运行
跳转用原生 Intent,不需要 ARouter,直接模块相互依赖就行。
模块化:拆分代码,直接依赖,原生跳转,不用 ARouter
3. 组件化
模块化的升级版
业务组件之间禁止互相依赖 ,可切换 Application/Library 独立运行
调试必须用 ARouter 路由 跳转、通信。
大厂大型 App 标准架构。
组件化:业务独立,禁止依赖,必须路由,必用 ARouter
4. 插件化
每个模块打包成独立 APK 插件,主 App 动态加载运行线上不需要发版,就能动态下发模块、更新页面
- 缺点:系统限制多、兼容性坑极多,现在原生插件化基本淘汰
- 替代方案:App Bundle 动态交付、鸿蒙服务卡片、动态化 SDK
5. 微服务架构(Android 移动端微组件化)
比组件化更细,公共能力全部下沉成独立服务(网络、权限、存储、支付),全部接口化,完全无硬依赖,大型超大型项目用。
二、代码分层架构(单个模块内部代码结构,面试必考)
和模块拆分无关,只管一个 module 里面 Activity/ViewModel/Model 怎么分层解耦你平时写代码的业务架构,全部属于这一类。
1. MVC(最原始)
View(页面)、Controller(Activity)、Model(数据)
- 问题:Activity 过于臃肿,业务全堆 Activity,耦合严重,难以维护
- 现状:老旧项目、简单页面还在用
2. MVP(MVC 升级版)
View、Presenter、Model把业务逻辑从 Activity 抽离到 Presenter
- 优点:解耦 Activity,可测试
- 缺点:接口泛滥、内存泄漏多、代码量暴增
- 现状:前几年主流,现在基本被 MVVM 淘汰
3. MVVM(目前 Android 官方主流、现在项目标配)
View、ViewModel、Model
- 核心:数据驱动视图、双向绑定、生命周期感知
- 组件:Jetpack 全套(ViewModel + LiveData + DataBinding/ViewBinding + Room)
- 优点:解耦、无内存泄漏、逻辑清晰、适合协作开发
- 你日常开发、公司项目 90% 都是 组件化工程 + MVVM 内部分层
4. MVI(MVVM 进阶、最新架构)
Model-View-Intent
单一数据源、单向数据流、状态唯一
把所有事件、状态统一封装,不可变数据
优点:逻辑极其清晰、便于调试、状态可回溯
适合复杂页面、大型业务、Compose 开发
现在越来越多新项目改用 MVI。
5. Clean 架构(整洁架构,大厂底层架构)
严格分层:
UI层 → 领域层(Domain) → 数据层(Data)
每一层完全隔离,依赖只能单向向内
抽离实体、用例、仓库,极度解耦,可移植性极强
适合超大型长期维护项目(微信、支付宝、字节大型 App)
三、结合你之前所有知识点,一张总表全部吃透
| 架构类型 | 包含架构 | 核心特点 | 使用场景 | 是否需要 ARouter |
|---|---|---|---|---|
| 工程架构(项目模块拆分) | 一体化、模块化、组件化、插件化、微服务 | 管整个项目 module 怎么拆、模块依赖 | 项目整体结构 | 模块化:不需要; 组件化:必须要 |
| 代码分层架构(模块内部) | MVC、MVP、MVVM、MVI、Clean | 管单个模块内代码怎么分层 | 页面业务代码编写 | 完全不需要 |
四、最容易混淆的灵魂区别(面试必问)
很多人搞错:组件化 ≠ MVVM
- 组件化 是工程层面 ,管模块拆分、模块之间怎么通信
- MVVM 是代码层面 ,管模块内部页面代码怎么写
真实公司项目标准组合(几乎所有中大型 App)
外层:组件化(工程拆分) 内层:MVVM / MVI(代码分层)
五、全部架构通俗一句话总结(背诵版)
【工程架构】
- 一体化:所有代码塞一个 app 模块,新手小项目
- 模块化 :拆多个 library,模块可互依赖,原生跳转
- 组件化 :业务独立可运行,模块禁止互依赖,必须 ARouter
- 插件化:模块拆成独立 apk 动态加载,现在基本淘汰
- 移动端微服务:组件化极致细化,能力全部接口化下沉
【代码分层架构】
- MVC:Activity 包揽一切,臃肿老旧
- MVP:抽逻辑到 Presenter,接口多、易内存泄漏
- MVVM:官方主推,数据驱动,ViewModel+LiveData,目前主流
- MVI:MVVM 升级版,单向数据流,状态统一,复杂项目首选
- Clean 整洁架构:严格分层单向依赖,超大型项目底层架构
六、终极最全对比
| 项目架构 | 是否需要 ARouter | 页面跳转方式 | 模块依赖关系 |
|---|---|---|---|
| 纯模块化 | ❌ 不需要 | 原生 Intent 直接跳转 | 直接 implementation 硬依赖 |
| 组件化 | ✅ 必须用 | ARouter 路径跳转 | 模块间无直接依赖,仅依赖基础库 |
1. 工程架构区别
- 模块化:拆分代码,模块可互相依赖,全部 library,不可独立运行
- 组件化:模块化进阶,业务组件独立可运行,组件间禁止依赖,路由通信
- 插件化:模块独立 APK,动态加载,线上动态更新
| 对比点 | 模块化 | 组件化 |
|---|---|---|
| 能否独立运行 | ❌ 不能,全是 library | ✅ 每个业务模块可单独跑 App |
| 拆分粒度 | 粗,按层级 / 功能拆分 | 细,按完整业务模块拆分 |
| 模块类型 | 全部 Android Library | 可切换:Application / Library |
| 依赖方式 | 直接 implementation 硬依赖 |
无直接依赖,路由跳转(ARouter) |
| 编译速度 | 改动一处全项目重编 | 只编译当前调试组件,极快 |
| 团队开发 | 多人易冲突,耦合高 | 多人并行开发,互不干扰 |
| 项目大小 | 中小型项目 | 大型、超大型项目 |
| 最终打包 | 一个 APK | 上线依然一个 APK |
| 核心目的 | 代码解耦、结构清晰 | 独立开发、并行开发、快速调试、彻底解耦 |
2. 代码分层架构区别
- MVC:View-Controller-Model,Activity 既是 View 又是 Controller
- MVP:抽离 Presenter,View 与 Model 完全隔离,接口通信
- MVVM:ViewModel 接管逻辑,数据驱动 UI,生命周期安全
- MVI:单向数据流,单一状态源,事件统一管理
- Clean 架构:严格四层分层,依赖向内,极致解耦