项目实战Now in Android:项目模块说明

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
职责:

  • 应用的主入口模块,包含 MainActivityNiaApp
  • 负责应用级别的导航设置(NiaNavHostTopLevelDestination
  • 整合所有功能模块和核心模块
  • 配置应用级别的依赖注入

依赖关系:

  • 依赖所有 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:common
    • core:database
    • core:datastore
    • core: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:uiapp 模块引用
  • 发布 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:datasync:work 模块引用

:core:testing

类型 : Android Library
职责:

  • 提供测试工具类和测试辅助功能
  • 包含测试运行器(NiaTestRunner)和测试工具

依赖关系:

  • 仅依赖测试相关外部库
  • 被所有模块的测试代码引用

:core:screenshot-testing

类型 : Android Library
职责:

  • 提供截图测试功能
  • 用于 UI 组件的视觉回归测试

依赖关系:

  • core:designsystem 和部分 feature 模块的测试代码引用

:core:data-test

类型 : Android Library
职责:

  • 提供数据层的测试工具和测试数据
  • 包含用于测试的假数据生成器

依赖关系:

  • appcore:data 的测试代码引用

:core:datastore-test

类型 : Android Library
职责:

  • 提供 DataStore 的测试工具
  • 包含测试用的 DataStore 实例

依赖关系:

  • app, core:data, core:datastore 的测试代码引用

三、功能模块 (Feature Modules)

所有功能模块都遵循相同的架构模式:

  • 包含该功能的 UI 界面(Compose Screen)
  • 包含 ViewModel(状态管理)
  • 依赖 core:datacore: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│
         └───────────┘

核心模块依赖链

  1. 数据模型层

    • core:model ← 被所有模块引用
  2. 数据持久化层

    • core:databasecore:model
    • core:datastore-proto → 无依赖
    • core:datastorecore:datastore-proto, core:model, core:common
  3. 网络层

    • core:networkcore:model, core:common
  4. 数据整合层

    • core:datacore:database, core:datastore, core:network, core:common
    • core:datacore:analytics, core:notifications (实现依赖)
  5. 领域层

    • core:domaincore:data, core:model
  6. UI 层

    • core:designsystem → 仅外部 Compose 库
    • core:uicore:designsystem, core:model, core:analytics

功能模块依赖模式

所有 feature 模块都遵循以下依赖模式:

复制代码
feature:xxx
    ↓
core:data (或 core:domain)
    ↓
core:database, core:datastore, core:network
    ↓
core:model

重要原则

  • ✅ Feature 模块可以依赖 core 模块
  • ✅ Feature 模块可以依赖 core:datacore: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 项目通过模块化架构实现了:

  1. 清晰的职责分离:每个模块都有明确的职责边界
  2. 良好的可维护性:模块独立,易于理解和修改
  3. 高效的并行开发:不同团队可以同时开发不同模块
  4. 强大的可测试性:每个模块都可以独立测试
  5. 灵活的扩展性:新功能可以作为新的 feature 模块添加

这种架构设计为大型 Android 应用开发提供了优秀的参考范例。

相关推荐
天上的光3 小时前
软件体系结构——基本架构演变
架构
@Aurora.3 小时前
【MySQL】基础
android
ooooooctober3 小时前
PHP代码审计框架性思维的建立
android·开发语言·php
q***82914 小时前
图文详述:MySQL的下载、安装、配置、使用
android·mysql·adb
radient4 小时前
Agent的"思考" - 智能体
后端·架构·ai编程
孟祥_成都4 小时前
下一代组件的奥义在此!headless 组件构建思想探索!
前端·设计模式·架构
沐怡旸5 小时前
【底层机制】Ashmem匿名共享内存:原理与应用深度解析
android·面试
用户2018792831675 小时前
Activity结束动画与System.exit(0)的黑屏之谜
android
Proud lion6 小时前
Apipost 脚本高频场景最佳实践:搞定接口签名验证、登录令牌刷新、动态参数生成等
android