📐 多模块架构下的 Compose 开发实践 第2讲

🏫 标准项目结构 · 模块划分 · 命名规范 ✨ 中小学生色系 · 轻快明朗

📁 1. 标准 Compose 项目目录结构

一个典型的 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:dataRepository 实现,数据映射,缓存策略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

🧩 2. 模块划分原则

多模块架构的核心是 高内聚、低耦合。针对 Compose 项目,我们提炼出以下原则:

  • 🔄 按业务能力拆分 (feature) — 每个独立页面或流程(首页、详情、搜索)一个模块,可独立编译、测试。
  • 🧱 核心抽象下沉 (core) — 将 UI 主题、网络、数据、工具类等通用能力抽取为 core:* 模块,避免循环依赖。
  • 📦 依赖方向严格单向 — feature → core,app → feature,禁止 feature 之间直接依赖(通过接口或导航通信)。
  • 🎨 Compose 主题与组件隔离 — core:ui 模块只存放公共组件、颜色、形状、排版,不包含业务逻辑。
  • 🧪 测试友好 — 每个模块自带 src/test 和 src/androidTest,可单独运行单元测试。
  • ⚙️ 构建约定统一 — 使用 build-logic 模块管理 Compose 编译器、Kotlin、AGP 版本,避免版本冲突。

📊 模块依赖关系 (示意图)

app feature:home feature:detail feature:search core:ui core:network core:data ⬆ 依赖方向:app → feature → core (单向)

🏷️ 3. 模块命名规范

清晰一致的命名让项目可维护性大幅提升。推荐采用 kebab-case (短横线) 命名 Gradle 模块,并遵循以下模式:

类型命名模式示例
应用壳appapp
核心模块core:{功能}core:ui, core:network, core:data, core:model
业务模块feature:{页面}feature:home, feature:detail, feature:search
构建逻辑build-logicbuild-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 模块标识:若模块仅包含 Compose 代码,可在描述中标注,但模块名无需额外加 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 仅声明依赖,不重复定义版本。