Now in Android 项目模块说明
本文档详细说明了 Now in Android 项目中每个模块的职责以及它们之间的依赖关系。
项目概述
Now in Android 是一个使用 Kotlin + Jetpack Compose 构建的现代化 Android 应用示例项目,展示了 Google 官方推荐的 Android 开发最佳实践。项目采用模块化架构,使用 Hilt 进行依赖注入,遵循 Clean Architecture 原则。
项目地址:https://github.com/android/nowinandroid
模块分类
项目中的模块主要分为以下几类:
- 应用模块 (app) - 主应用入口,整合所有功能模块
- 核心模块 (core) - 提供通用功能和基础设施
- 功能模块 (feature) - 实现具体的业务功能
- 同步模块 (sync) - 后台数据同步
- 测试与工具模块 - 测试工具和辅助模块
一、应用模块
:app
类型 : Android Application Module
职责:
- 应用的主入口模块,包含
MainActivity和NiaApp - 负责应用级别的导航设置(
NiaNavHost、TopLevelDestination) - 整合所有功能模块和核心模块
- 配置应用级别的依赖注入
依赖关系:
- 依赖所有
feature模块(foryou, interests, bookmarks, topic, search, settings) - 依赖核心模块:
core:common,core:ui,core:designsystem,core:data,core:model,core:analytics - 依赖
sync:work模块 - 测试依赖:
core:data-test,core:datastore-test,core:testing,core:screenshot-testing
二、核心模块 (Core Modules)
:core:model
类型 : JVM Library
职责:
- 定义应用的数据模型(实体类、数据类)
- 包含所有业务领域的数据结构定义
- 纯 Kotlin 模块,不依赖 Android 框架
依赖关系:
- 仅依赖外部库:
kotlinx-datetime - 被其他所有模块引用(作为基础数据模型)
:core:common
类型 : JVM Library
职责:
- 提供通用的工具类和扩展函数
- 包含跨模块共享的通用功能
- 纯 Kotlin 模块,不依赖 Android 框架
依赖关系:
- 仅依赖外部库:
kotlinx-coroutines-core - 被
core:data,core:network,core:datastore,core:notifications等模块引用
:core:database
类型 : Android Library
职责:
- 使用 Room 数据库进行本地数据持久化
- 定义数据库实体、DAO(Data Access Object)和数据库实例
- 提供数据库访问接口
依赖关系:
- 依赖
core:model(使用数据模型) - 被
core:data模块引用
:core:datastore-proto
类型 : Android Library
职责:
- 定义 DataStore 使用的 Protocol Buffers 协议文件
- 生成 Proto 数据类
依赖关系:
- 仅依赖外部库:
protobuf-kotlin-lite - 被
core:datastore模块引用
:core:datastore
类型 : Android Library
职责:
- 使用 DataStore 进行键值对和类型化数据的持久化存储
- 提供用户偏好设置等轻量级数据的存储功能
依赖关系:
- 依赖
core:datastore-proto(Proto 定义) - 依赖
core:model(数据模型) - 依赖
core:common(通用工具) - 被
core:data模块引用
:core:network
类型 : Android Library
职责:
- 使用 Retrofit 和 OkHttp 进行网络请求
- 定义 API 接口和数据传输对象(DTO)
- 处理网络请求和响应
依赖关系:
- 依赖
core:model(数据模型) - 依赖
core:common(通用工具) - 被
core:data模块引用
:core:data
类型 : Android Library
职责:
- 数据层核心模块,整合所有数据源
- 实现 Repository 模式,统一管理数据获取逻辑
- 协调本地数据库(Room)、远程网络(Retrofit)和 DataStore
- 提供统一的数据访问接口给上层模块
依赖关系:
- API 依赖 (对外暴露):
core:commoncore:databasecore:datastorecore:network
- 实现依赖 (内部使用):
core:analytics(数据分析)core:notifications(通知功能)
- 被
core:domain和所有feature模块引用
:core:domain
类型 : Android Library
职责:
- 领域层模块,包含业务逻辑和用例(Use Cases)
- 实现业务规则和领域逻辑
- 不依赖 UI 层,保持业务逻辑的独立性
依赖关系:
- 依赖
core:data(数据访问) - 依赖
core:model(数据模型) - 被部分
feature模块引用(foryou, interests, search)
:core:designsystem
类型 : Android Library
职责:
- 定义应用的设计系统组件
- 包含 Material 3 主题、颜色、字体、图标等
- 提供可复用的 UI 组件和样式
依赖关系:
- 仅依赖外部 Compose 库
- 被
core:ui和app模块引用 - 发布 lint 规则到
:lint模块
:core:ui
类型 : Android Library
职责:
- 提供通用的 UI 组件和可组合函数
- 包含可复用的 Compose 组件
- 封装常用的 UI 功能(如文章卡片、列表项等)
依赖关系:
- 依赖
core:designsystem(设计系统) - 依赖
core:model(数据模型) - 依赖
core:analytics(分析统计) - 被
app和部分feature模块引用
:core:analytics
类型 : Android Library
职责:
- 处理应用的分析和统计功能
- 集成 Firebase Analytics(生产环境)
- 提供统一的分析接口
依赖关系:
- 仅依赖外部库(Firebase Analytics)
- 被
core:data,core:ui,app,sync:work等模块引用
:core:notifications
类型 : Android Library
职责:
- 处理应用通知功能
- 管理通知的创建和显示
依赖关系:
- 依赖
core:model(数据模型) - 依赖
core:common(通用工具) - 被
core:data和sync:work模块引用
:core:testing
类型 : Android Library
职责:
- 提供测试工具类和测试辅助功能
- 包含测试运行器(
NiaTestRunner)和测试工具
依赖关系:
- 仅依赖测试相关外部库
- 被所有模块的测试代码引用
:core:screenshot-testing
类型 : Android Library
职责:
- 提供截图测试功能
- 用于 UI 组件的视觉回归测试
依赖关系:
- 被
core:designsystem和部分feature模块的测试代码引用
:core:data-test
类型 : Android Library
职责:
- 提供数据层的测试工具和测试数据
- 包含用于测试的假数据生成器
依赖关系:
- 被
app和core:data的测试代码引用
:core:datastore-test
类型 : Android Library
职责:
- 提供 DataStore 的测试工具
- 包含测试用的 DataStore 实例
依赖关系:
- 被
app,core:data,core:datastore的测试代码引用
三、功能模块 (Feature Modules)
所有功能模块都遵循相同的架构模式:
- 包含该功能的 UI 界面(Compose Screen)
- 包含 ViewModel(状态管理)
- 依赖
core:data或core:domain获取数据 - 不依赖其他
feature模块(保持模块独立性)
:feature:foryou
职责:
- "为你推荐"功能
- 显示用户的个性化新闻 feed
- 首次运行时的引导流程
依赖关系:
- 依赖
core:data(数据访问) - 依赖
core:domain(业务逻辑) - 依赖
core:notifications(通知功能)
:feature:interests
职责:
- 兴趣管理功能
- 允许用户选择和管理感兴趣的主题
依赖关系:
- 依赖
core:data(数据访问) - 依赖
core:domain(业务逻辑)
:feature:bookmarks
职责:
- 书签功能
- 管理用户收藏的文章
依赖关系:
- 依赖
core:data(数据访问)
:feature:topic
职责:
- 主题详情功能
- 显示特定主题的相关内容
依赖关系:
- 依赖
core:data(数据访问)
:feature:search
职责:
- 搜索功能
- 提供文章和主题的搜索能力
依赖关系:
- 依赖
core:data(数据访问) - 依赖
core:domain(业务逻辑)
:feature:settings
职责:
- 设置功能
- 应用设置和配置界面
- 开源许可证显示
依赖关系:
- 依赖
core:data(数据访问)
四、同步模块
:sync:work
类型 : Android Library
职责:
- 使用 WorkManager 进行后台数据同步
- 定期从服务器同步最新内容
- 处理推送通知触发的同步
依赖关系:
- 依赖
core:data(数据访问) - 依赖
core:analytics(分析统计) - 依赖
core:notifications(通知功能) - 依赖 Hilt WorkManager 扩展
:sync:sync-test
类型 : Android Library
职责:
- 提供同步功能的测试工具
依赖关系:
- 被
app模块的测试代码引用
五、其他模块
:benchmarks
类型 : Android Test Module
职责:
- 性能基准测试
- 生成 Baseline Profile 用于性能优化
依赖关系:
- 被
app模块用于生成 Baseline Profile
:app-nia-catalog
类型 : Android Application Module
职责:
- 设计系统展示应用
- 用于快速预览设计系统组件
依赖关系:
- 独立的应用模块,用于展示设计系统
:lint
类型 : Android Library
职责:
- 自定义 Lint 规则
- 定义项目的代码检查规则
依赖关系:
- 被
core:designsystem模块发布和使用
:ui-test-hilt-manifest
类型 : Android Library
职责:
- 为 UI 测试提供 Hilt 清单文件
- 解决测试中的依赖注入配置
依赖关系:
- 被
app模块的测试代码引用
模块依赖关系图
整体架构层次
┌─────────────────────────────────────────┐
│ :app (应用层) │
└──────────────┬──────────────────────────┘
│
┌──────────┴──────────┐
│ │
┌───▼────┐ ┌──────▼──────┐
│feature │ │ core:ui │
│modules │ │ core:design │
└───┬────┘ └──────┬──────┘
│ │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ core:domain │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ core:data │
└──────────┬──────────┘
│
┌──────────┴──────────┐
│ │
┌───▼────┐ ┌──────────▼──────────┐ ┌──────▼──────┐
│database│ │ network │ │ datastore │
└───┬────┘ └──────────┬──────────┘ └──────┬──────┘
│ │ │
└──────────┬──────┴─────────────────────┘
│
┌─────▼─────┐
│ core:model│
└───────────┘
核心模块依赖链
-
数据模型层:
core:model← 被所有模块引用
-
数据持久化层:
core:database→core:modelcore:datastore-proto→ 无依赖core:datastore→core:datastore-proto,core:model,core:common
-
网络层:
core:network→core:model,core:common
-
数据整合层:
core:data→core:database,core:datastore,core:network,core:commoncore:data→core:analytics,core:notifications(实现依赖)
-
领域层:
core:domain→core:data,core:model
-
UI 层:
core:designsystem→ 仅外部 Compose 库core:ui→core:designsystem,core:model,core:analytics
功能模块依赖模式
所有 feature 模块都遵循以下依赖模式:
feature:xxx
↓
core:data (或 core:domain)
↓
core:database, core:datastore, core:network
↓
core:model
重要原则:
- ✅ Feature 模块可以依赖
core模块 - ✅ Feature 模块可以依赖
core:data或core:domain - ❌ Feature 模块不能 依赖其他
feature模块 - ❌ Feature 模块不能 依赖
app模块
模块设计原则
1. 分层架构
- 表现层 (Presentation) :
app,feature:* - 领域层 (Domain) :
core:domain - 数据层 (Data) :
core:data,core:database,core:datastore,core:network - 模型层 (Model) :
core:model
2. 依赖方向
- 依赖方向始终向下:上层模块依赖下层模块
- 不允许循环依赖
- Feature 模块之间相互独立
3. 模块职责
- 单一职责原则:每个模块只负责一个明确的功能领域
- 高内聚低耦合:模块内部高度相关,模块之间依赖最小化
- 可测试性:每个模块都可以独立测试
4. API 暴露策略
- 使用
api依赖暴露接口给下游模块 - 使用
implementation依赖隐藏内部实现细节
总结
Now in Android 项目通过模块化架构实现了:
- 清晰的职责分离:每个模块都有明确的职责边界
- 良好的可维护性:模块独立,易于理解和修改
- 高效的并行开发:不同团队可以同时开发不同模块
- 强大的可测试性:每个模块都可以独立测试
- 灵活的扩展性:新功能可以作为新的 feature 模块添加
这种架构设计为大型 Android 应用开发提供了优秀的参考范例。