Android 组件化架构设计与实现方案详解
前言
随着移动应用规模的扩大,单体架构逐渐暴露出维护困难、耦合度高、编译速度慢等问题。在大多数大厂或具备一定规模的公司中,App 重构时通常会考虑采用组件化或模块化架构。其核心目的是为了方便 App 解耦和优化。
在我的理解中,组件化即将每个功能相同的模块一个个封装起来,然后以 Library 的形式供主 App 模块调用。在主 App 模块中不会进行任何的业务逻辑,只管打包组装;而除了主 App 模块外,其他模块各回各家,各找各妈,干自己的业务逻辑去。简单来说,组件化就是让 Library 和 Application 之间可以互相切换,Library 可以作为单独的 App 运行,也可以作为依赖库给主 App 调用。这种构建思想能大大提升开发效率,降低代码的维护成本,减少代码的耦合度,让他人简单易懂。
整体结构设计
一个标准的组件化项目通常包含以下结构:
- common:基础组件部分,与业务无关,需要所有组件共同依赖的部分。如网络请求封装、图片加载封装、UI 相关基类、工具集合等(当然这些内容可以依据分层原则放在不同的基础 Module 中)。
- router-comp:路由驱动组件,承载整个项目的路由工作。
- comp1:业务组件 1,如视频组件,可独立运行。
- comp2:业务组件 2,如新闻组件,可独立运行。
- comp3:业务组件 3,如支付组件,可独立运行。
- app:壳工程,用于将各个组件组装成一个完整的 App。
组件化所面临的核心问题
在实施组件化过程中,主要面临以下几个技术挑战:
- 集成模式与组件模式转换(热插拔):如何在不修改大量配置的情况下,让模块在独立开发和集成调试之间自由切换。
- 组件之间页面跳转(路由):不同组件间如何实现解耦的页面导航。
- 组件之间通信、调用彼此服务:如何在无直接依赖的情况下调用其他组件的服务接口。
- 打包混淆:如何在多模块环境下统一处理代码混淆规则。
组件化的实现方案
针对上述问题,我们逐一说明它们的解决方案。当解决完这些问题后,你就搭建了一个基于组件化的项目。
1. 集成模式与组件模式转换(热插拔)
Android 工程通过 Gradle 构建,通过配置每个 Module 的 Gradle 文件,来实现 Module 的不同表现。Android Studio 的 Module 有两种属性,分别是:
- Application 属性:可独立运行,也就是我们的 App。
- Library 属性:不可独立运行,被 App 依赖的库。
Module 属性通过其目录下的 build.gradle 文件配置。当 Module 属性为 Application 时,该 Module 作为完整的 App 存在,可以独自运行,方便编译和调试;当 Module 属性为 Library 时,该 Module 作为一个依赖库,被壳工程依赖并组装成一个 App。
那么如何让这两种模式可以自动转换呢?如果每次切换模式的时候,都手动去修改每个组件的配置,组件少的情况下还可以接受,组件多了会非常不方便。下面我们来聊聊如何实现两种模式的自动转换。
第一步:声明全局配置变量
首先,声明全局配置变量,来标识 Module 的属性(App 或 Library)。如在工程根目录下的 build.gradle 文件中声明布尔变量 ext.isModule,true 代表组件作为可独立运行的 App,false 代表组件作为被依赖的 Library。
buildscript {
ext.kotlin_version = '1.3.21'
ext.isModule = true // true - 每个组件都是单独的 module,可独立运行;false - 组件作为 library 存在
repositories {
google()
jcenter()
}
}


