You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android MVVM架构下如何实现符合Clean Architecture的关注点分离?

首先明确两个核心结论:

  1. 你当前单module按功能分包的实现,只要各层边界清晰、没有跨层反向依赖,完全符合Clean Architecture的核心原则,物理层面的多module拆分是可选优化项,不是必选要求。
  2. Dagger的「模块(Module)」是依赖注入框架的逻辑管理单元,和工程结构层面的分层模块不是同一个概念,Dagger的作用是帮你管控各层的依赖注入,不能用来实现工程层面的分层拆分。

两种Android分层落地方案

你可以根据项目规模、团队协作需求选择对应方案,两种方案都完全对齐你在.NET平台的分层设计理念:

方案1:单module逻辑分层(推荐中小项目/当前现有项目优先选用)

无需调整工程结构,只要进一步梳理现有包的边界、强制依赖规则即可完成优化:

  • 按Clean Architecture的依赖规则对齐现有包:
    • 内层(实体层):统一收纳dto/model/poco类,以及不依赖Android SDK的通用工具类(比如helper_json、helper_date等),这一层不允许依赖任何其他层的代码
    • 中间层1(数据层):收纳repository全量代码,以及和数据操作相关的工具类(比如helper_http、helper_file、helper_smtp等),仅对外暴露数据访问接口,隐藏具体实现(AWS、SQLite的操作逻辑不能暴露给上层)
    • 中间层2(领域层):收纳services全量业务逻辑代码,仅依赖实体层和数据层的接口,不允许引用任何Android SDK相关类,也不能调用任何UI层代码
    • 外层(表示层):收纳ui全量代码,仅依赖领域层的服务接口,不允许直接调用数据层的Repository实现
  • 依赖规则强制:所有依赖只能从外层指向内层,禁止反向依赖,比如UI层不能直接读写数据库、数据层不能持有ViewModel实例
  • Dagger用法:可以按分层创建对应的Dagger Module,比如DataModule提供Repository实例、DomainModule提供Service实例、UiModule提供ViewModel相关依赖,用依赖注入自动管理各层实例的创建,避免人为写出跨层依赖的代码。

方案2:多module物理拆分(适合中大型项目/多人协作场景,和.NET分层建独立项目逻辑完全一致)

如果需要更严格的边界管控、或者有跨项目复用代码的需求,可以和.NET一样拆成多个独立module,编译期自动校验依赖规则:

  • 拆分4个独立module:
    • :core-entity:纯Java library module,不依赖任何Android SDK,仅存放实体类、通用无依赖工具类
    • :core-data:Android library module,仅依赖:core-entity,存放所有数据操作相关代码(Repository、数据库、网络、文件操作等)
    • :core-domain:纯Java library module,仅依赖:core-entity,存放所有业务逻辑代码,完全不接触Android相关API
    • :app:主application module,依赖:core-domain、:core-entity,仅存放UI相关代码,不允许直接依赖:core-data
  • 这种拆分方式和你熟悉的.NET分层项目逻辑完全一致,各module独立,编译期就会禁止反向依赖,边界管控最严格。

现有项目优化优先级建议

  1. 先做单module的逻辑梳理,拆分helpers包的工具类到对应分层,整理跨层依赖的问题,先把逻辑边界划清
  2. 接入Dagger管理各层依赖,避免后续迭代中出现不合理的跨层调用
  3. 如果后续项目规模扩大、或者有代码复用需求,再逐步拆分多module即可,不需要为了符合所谓的「规范」直接上来就做多module拆分,反而增加维护成本。

内容的提问来源于stack exchange,提问作者Diego Perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:45:02