第19章 模块化与组件化架构¶
学习目标:掌握Android模块化开发,理解组件化架构设计,实现模块间解耦。
预计学习时间:3-5天 实践时间:1-2天
目录¶
1. 模块化基础¶
1.1 为什么模块化¶
- 代码复用
- 并行开发
- 独立测试
- 按需编译
1.2 模块类型¶
Text Only
app/ # 主模块
├── feature-home/ # 首页模块
├── feature-profile/ # 个人中心模块
├── feature-settings/ # 设置模块
├── core-common/ # 公共模块
├── core-network/ # 网络模块
└── core-database/ # 数据库模块
1.3 Gradle配置¶
Kotlin
// settings.gradle.kts
include(":app")
include(":feature:home")
include(":feature:profile")
include(":core:network")
// build.gradle.kts (feature模块)
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
dependencies {
implementation(project(":core:common"))
implementation(project(":core:network"))
}
2. 组件化架构¶
2.1 组件化 vs 模块化¶
| 特性 | 模块化 | 组件化 |
|---|---|---|
| 编译 | 一起编译 | 独立编译 |
| 运行 | 一起运行 | 可独立运行 |
| 耦合 | 低耦合 | 完全解耦 |
| 适用 | 中小型项目 | 大型项目 |
2.2 组件化设计¶
Text Only
app/ # 壳工程
├── module-home/ # 首页组件(可独立运行)
├── module-profile/ # 个人中心组件
├── module-login/ # 登录组件
├── library-base/ # 基础库
└── library-router/ # 路由库
2.3 组件切换¶
Kotlin
// build.gradle.kts 中根据 isModuleMode 切换插件
if (isModuleMode) {
plugins {
id("com.android.application")
}
} else {
plugins {
id("com.android.library")
}
}
android {
sourceSets {
getByName("main") {
if (isModuleMode) {
manifest.srcFile("src/main/module/AndroidManifest.xml")
} else {
manifest.srcFile("src/main/AndroidManifest.xml")
}
}
}
}
3. 模块间通信¶
3.1 接口下沉¶
Kotlin
// library-base 定义接口
interface ILoginService { // interface定义类型契约
fun login(context: Context)
fun isLoggedIn(): Boolean
fun getUserId(): String?
}
// module-login 实现接口
class LoginServiceImpl : ILoginService {
override fun login(context: Context) {
// 实现登录
}
// ...
}
3.2 服务注册与发现¶
Kotlin
// 服务管理器
object ServiceManager {
private val services = mutableMapOf<Class<*>, Any>()
fun <T> register(serviceClass: Class<T>, impl: T) { // 泛型<T>:类型参数化
services[serviceClass] = impl as Any
}
fun <T> get(serviceClass: Class<T>): T? {
return services[serviceClass] as? T
}
}
// 注册
ServiceManager.register(ILoginService::class.java, LoginServiceImpl())
// 使用
val loginService = ServiceManager.get(ILoginService::class.java)
loginService?.login(context)
4. 路由框架¶
4.1 ARouter使用¶
Kotlin
// 添加依赖
dependencies {
implementation("com.alibaba:arouter-api:1.5.2")
kapt("com.alibaba:arouter-compiler:1.5.2")
}
// 初始化
ARouter.init(application)
// 声明路由
@Route(path = "/home/main")
class HomeActivity : AppCompatActivity()
// 跳转
ARouter.getInstance().build("/home/main").navigation()
// 带参数跳转
ARouter.getInstance()
.build("/profile/detail")
.withString("userId", "123")
.navigation()
4.2 自定义路由¶
Kotlin
// 路由表
object Routes {
const val HOME = "/home/main"
const val PROFILE = "/profile/main"
const val SETTINGS = "/settings/main"
}
// 路由跳转
object Router {
fun navigate(context: Context, path: String, params: Bundle? = null) {
val intent = Intent()
intent.setClassName(context, getActivityName(path))
params?.let { intent.putExtras(it) }
context.startActivity(intent)
}
}
5. 实践练习¶
练习1:模块化改造¶
任务:将单模块项目改造为多模块
要求: - 分离feature模块 - 提取core模块 - 解决依赖关系
练习2:组件化通信¶
任务:实现模块间通信
要求: - 接口下沉 - 服务注册 - 路由跳转
本章小结¶
核心要点¶
- 模块化提高代码复用和并行开发效率
- 组件化实现完全解耦,支持独立运行
- 接口下沉是模块通信的基础
- 路由框架简化页面跳转
下一步¶
完成本章学习后,请进入第20章:插件化与热修复技术。
本章完成时间:预计3-5天