一个典型的 Jetpack Compose 多模块项目遵循 Android 官方推荐的分层架构,并结合 Gradle 多模块构建。以下是标准布局:
| 层级 / 模块 | 职责 | 典型目录 |
|---|---|---|
| app (主模块) | Application 入口、导航、依赖注入、顶层 Compose 宿主 | app/src/main/java/... |
| core:ui | 通用 Compose 组件、主题、颜色、排版、公共组件 | core/ui/src/main/java/... |
| core:network | 网络层 (Retrofit, Ktor),数据源,拦截器 | core/network/src/main/java/... |
| core:data | Repository 实现,数据映射,缓存策略 | core/data/src/main/java/... |
| feature:home | 首页业务模块,包含页面、ViewModel、状态 | feature/home/src/main/java/... |
| feature:detail | 详情页模块,独立导航,懒加载 | feature/detail/src/main/java/... |
| feature:search | 搜索模块,组件 + 状态管理 | feature/search/src/main/java/... |
| build-logic | 约定插件,版本目录 (libs.versions.toml) | build-logic/src/main/kotlin |
📌 每个模块内部通常包含 src/main/java/包名/... 以及 src/test/ 测试目录。Compose 代码统一放在 ui/ 或 compose/ 包下。
📦 project-root/
┣ 📂 app/ # 主应用壳
┃ ┣ 📂 src/main/java/com/example/app
┃ ┃ ┣ 📂 MainActivity.kt
┃ ┃ ┣ 📂 ComposeApp.kt
┃ ┃ ┗ 📂 navigation/
┣ 📂 core/
┃ ┣ 📂 ui/ # 公共UI组件、主题
┃ ┣ 📂 network/ # 网络层
┃ ┣ 📂 data/ # 数据仓库
┃ ┗ 📂 model/ # 共享数据模型
┣ 📂 feature/
┃ ┣ 📂 home/ # 首页模块
┃ ┣ 📂 detail/ # 详情模块
┃ ┗ 📂 search/ # 搜索模块
┣ 📂 build-logic/ # 构建约定
┣ 📂 gradle/
┃ ┗ 📂 libs.versions.toml # 版本目录
┗ 📜 settings.gradle.kts
多模块架构的核心是 高内聚、低耦合。针对 Compose 项目,我们提炼出以下原则:
core:* 模块,避免循环依赖。feature → core,app → feature,禁止 feature 之间直接依赖(通过接口或导航通信)。core:ui 模块只存放公共组件、颜色、形状、排版,不包含业务逻辑。src/test 和 src/androidTest,可单独运行单元测试。build-logic 模块管理 Compose 编译器、Kotlin、AGP 版本,避免版本冲突。清晰一致的命名让项目可维护性大幅提升。推荐采用 kebab-case (短横线) 命名 Gradle 模块,并遵循以下模式:
| 类型 | 命名模式 | 示例 |
|---|---|---|
| 应用壳 | app | app |
| 核心模块 | core:{功能} | core:ui, core:network, core:data, core:model |
| 业务模块 | feature:{页面} | feature:home, feature:detail, feature:search |
| 构建逻辑 | build-logic | build-logic (或 build-logic:convention) |
| 测试模块 (可选) | testing:{类型} | testing:unit, testing:compose |
core:ui 而非 core:UI)。core.ui 模块的根包为 com.example.core.ui。core:net 不如 core:network 直观;feature:detail 而非 feature:det。core:ui 中,主题资源使用 core_ui_ 前缀,避免合并冲突。compose 字段。// settings.gradle.kts 示例
rootProject.name = "ComposeMultiModule"
include(":app")
include(":core:ui")
include(":core:network")
include(":core:data")
include(":feature:home")
include(":feature:detail")
include(":feature:search")
include(":build-logic")
💡 小贴士:使用 libs.versions.toml 统一管理版本,每个模块的 build.gradle.kts 仅声明依赖,不重复定义版本。