Skip to content

android-clean-architecture Skill 是 Everything Claude Code 针对 Android 与 KMP 项目分层架构的核心能力,覆盖模块结构、依赖反转、UseCase/Repository 模式、数据层设计(Room、SQLDelight、Ktor)、依赖注入(Koin/Hilt)等关键环节。它解决了传统 Android 项目中业务逻辑分散、依赖混乱、可测试性差等痛点,帮助开发者用 AI 快速生成、审查并重构生产级 Clean Architecture 工程骨架,极大提升跨平台代码质量和协作效率。

Everything Claude Code Android Clean Architecture:KMP 模块结构、依赖规则、UseCase 与 Repository 模式

在 AI 编程助手(如 Claude Code、Codex、Cursor)辅助下构建 Android 或 Kotlin Multiplatform (KMP) 项目时,如何系统性落地 Clean Architecture?android-clean-architecture Skill 正是为此而生。它内置于 Everything Claude Code 插件体系,结合 Skills、Agents、Hooks、Rules 的方法论,让你从项目初始化、分层设计、依赖注入到数据流转全流程自动化、标准化,避免传统项目中常见的“业务逻辑散落各层、数据层耦合 UI、模块依赖混乱”等问题。

本指南将带你从 Skill 触发场景、模块结构、依赖规则、UseCase/Repository 实现到数据层与依赖注入配置,逐步掌握如何用好这一 Skill,并介绍常见配套 Agent 及与其他 Skill 的协作关系。


1. 适用场景与触发条件

android-clean-architecture Skill 会在以下场景自动激活:

  • 新建或重构 Android/KMP 项目时,需要明确分层和模块边界
  • 设计 UseCase、Repository、DataSource 等业务与数据分离模式
  • 需要 Room/SQLDelight/Ktor 等多数据源整合的标准实现
  • 配置依赖注入(Koin、Hilt),保证依赖流向合理
  • 希望提升可测试性、可维护性、跨平台代码复用能力

对比未使用该 Skill 的常见问题:

  • 业务逻辑写在 ViewModel、Activity,难以复用和测试
  • 数据层(如 Room/网络 DTO)直接暴露给 UI,导致类型污染
  • 模块间循环依赖,难以解耦和扩展
  • 缺乏统一的错误处理和依赖注入规范

2. 推荐模块结构与依赖规则

Skill 会建议并自动生成如下分层结构(适用于 Android 与 KMP 工程):

project/
├── app/                  # Android 入口,DI 配置,Application 类
├── core/                 # 通用工具、基础类、错误类型
├── domain/               # UseCase、领域模型、仓库接口(纯 Kotlin,无依赖)
├── data/                 # 仓库实现、数据源、DB、网络
├── presentation/         # 屏幕、ViewModel、UI 模型、导航
├── design-system/        # 复用 Compose 组件、主题
└── feature/              # 可选,按功能拆分的子模块

依赖流向(强约束):

app → presentation, domain, data, core
presentation → domain, design-system, core
data → domain, core
domain → core (或无依赖)
core → (无依赖)

关键点domain 层绝不能依赖 datapresentation 或任何框架,保证纯 Kotlin、可移植、可测试。


3. UseCase 与 Repository 模式落地

Step 1:在 domain 层定义 UseCase 与 Repository 接口

kotlin
// UseCase 示例
class GetItemsByCategoryUseCase(
    private val repository: ItemRepository
) {
    suspend operator fun invoke(category: String): Result<List<Item>> =
        repository.getItemsByCategory(category)
}

// Repository 接口
interface ItemRepository {
    suspend fun getItemsByCategory(category: String): Result<List<Item>>
    suspend fun saveItem(item: Item): Result<Unit>
    fun observeItems(): Flow<List<Item>>
}
  • UseCase 只依赖 Repository 接口,业务操作单一职责,便于测试与复用
  • 领域模型为纯 data class,无任何 Android/框架注解

Step 2:在 data 层实现 Repository,协调本地与远程数据源

kotlin
class ItemRepositoryImpl(
    private val localDataSource: ItemLocalDataSource,
    private val remoteDataSource: ItemRemoteDataSource
) : ItemRepository {

    override suspend fun getItemsByCategory(category: String): Result<List<Item>> {
        return runCatching {
            val remote = remoteDataSource.fetchItems(category)
            localDataSource.insertItems(remote.map { it.toEntity() })
            localDataSource.getItemsByCategory(category).map { it.toDomain() }
        }
    }
    // ... 其他方法
}
  • 数据层只依赖 domain,不反向依赖
  • Mapper(DTO/Entity ↔ Domain)作为扩展函数靠近数据模型定义,保证类型隔离

Step 3:数据层实现(Room/SQLDelight/Ktor)

  • Room(Android):定义 Entity/Dao,数据操作全部封装
  • SQLDelight(KMP):声明 SQL,自动生成类型安全接口
  • Ktor(KMP 网络):统一网络访问,支持多平台
kotlin
// Room Entity 示例
@Entity(tableName = "items")
data class ItemEntity(
    @PrimaryKey val id: String,
    val title: String,
    // ...
)
sql
-- SQLDelight 示例
CREATE TABLE ItemEntity (
    id TEXT NOT NULL PRIMARY KEY,
    -- ...
);

4. 依赖注入配置(Koin/Hilt)

Koin(KMP 跨平台推荐)

kotlin
val domainModule = module {
    factory { GetItemsByCategoryUseCase(get()) }
}
val dataModule = module {
    single<ItemRepository> { ItemRepositoryImpl(get(), get()) }
}

Hilt(Android-only)

kotlin
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
    @Binds
    abstract fun bindItemRepository(impl: ItemRepositoryImpl): ItemRepository
}

Skill 会自动生成/补全 DI 配置,确保依赖流向不被破坏。


5. 错误处理与协作模式

  • 推荐用 Result<T> 或自定义 sealed 类型(如 Try/AppError)贯穿 domain→presentation,UI 层统一映射为 UI 状态
  • ViewModel 仅负责状态管理与 UI 交互,业务逻辑全部通过 UseCase 调用
kotlin
viewModelScope.launch {
    when (val result = getItems(category)) {
        is Try.Success -> _state.update { it.copy(items = result.value) }
        is Try.Failure -> _state.update { it.copy(error = result.error.toMessage()) }
    }
}

6. Skill 输出示例

AI 生成的项目结构/代码片段示例:

  • 自动生成标准分层目录与 build.gradle.kts 配置
  • 按需输出 UseCase、Repository、Mapper、Room/SQLDelight/Ktor 实现骨架
  • 自动补全 DI 配置与错误处理模式
  • 检查并提示模块依赖违规、业务逻辑泄漏等反模式

7. 常见配套 Agent 与 Skill 协作


8. 与其他 Skill 的协作关系


FAQ

Q: 这个 Skill 适用于纯 Android 项目还是 KMP 多平台工程?
A: 二者皆可。Skill 会根据你的项目类型自动输出 Room(Android)、SQLDelight/Ktor(KMP)等对应实现。

Q: 如何防止 domain 层被误引用 Android/数据层类型?
A: Skill 会自动检查 domain 依赖树,禁止任何 framework/entity/DTO 类型渗透,并在 PR 或代码生成时给出警告。

Q: 项目已存在部分业务逻辑在 ViewModel,能自动迁移到 UseCase 吗?
A: 可以。配合代码审查 Agent,Skill 可识别并建议/自动迁移业务逻辑到 UseCase,提升可测试性和分层一致性。