跳转到正文
YGJoon
返回

Android Kotlin 架构组件与多模块协同

编辑文章

架构演进概览

层级关键技术栈Kotlin 特性
表现层 UIJetpack Compose / XML + ViewModel协程、StateFlow、不可变数据类
领域层 DomainUseCase、Repository 接口接口委托、密封类
数据层 DataRetrofit、Room、DataStore、WorkManager协程、Flow、扩展函数

模块划分示例

app/                 // 壳模块,包含启动与导航
feature/home/        // 业务模块(UI + ViewModel)
feature/profile/
core/designsystem/   // UI 组件库
core/network/        // 网络层封装
core/database/       // 数据库封装
core/model/          // 数据模型与跨模块实体
core/common/         // 工具、日志、配置

Gradle 配置片段

plugins {
    id("com.android.library")
    kotlin("android")
    kotlin("kapt")
    id("dagger.hilt.android.plugin")
}

android {
    namespace = "com.example.feature.home"
}

dependencies {
    implementation(project(":core:model"))
    implementation(project(":core:network"))
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4")
    implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
}

Jetpack 核心组件实践

ViewModel + UseCase

class LoadHomeUseCase @Inject constructor(
    private val repository: HomeRepository
) {
    suspend operator fun invoke(): HomeData = repository.fetchHome()
}

@HiltViewModel
class HomeViewModel @Inject constructor(
    private val loadHome: LoadHomeUseCase
) : ViewModel() {

    private val _uiState = MutableStateFlow<HomeUiState>(HomeUiState.Loading)
    val uiState: StateFlow<HomeUiState> = _uiState.asStateFlow()

    fun refresh() = viewModelScope.launch {
        runCatching { loadHome() }
            .onSuccess { _uiState.value = HomeUiState.Success(it) }
            .onFailure { _uiState.value = HomeUiState.Error(it) }
    }
}

DataStore + Flow

val Context.userPreferences: DataStore<UserPreferences> by dataStore(
    fileName = "user_prefs.pb",
    serializer = UserPreferencesSerializer
)

class UserPreferencesRepository @Inject constructor(
    @ApplicationContext private val context: Context
) {
    val userTheme: Flow<AppTheme> = context.userPreferences.data
        .map { prefs -> prefs.theme }
        .map { theme -> AppTheme.valueOf(theme) }
}

WorkManager 协程任务

class SyncWorker(
    appContext: Context,
    workerParams: WorkerParameters,
    private val repository: SyncRepository
) : CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        return runCatching { repository.syncAll() }
            .fold(onSuccess = { Result.success() }, onFailure = { Result.retry() })
    }
}

多模块协同策略

// libs.versions.toml
[versions]
kotlin = "1.9.24"
coroutines = "1.8.1"

[libraries]
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }

API 设计与错误处理

sealed class Resource<out T> {
    data class Success<T>(val data: T) : Resource<T>()
    data class Error(val error: Throwable) : Resource<Nothing>()
    data object Loading : Resource<Nothing>()
}

fun <T> Flow<T>.asResource(): Flow<Resource<T>> = flow {
    emit(Resource.Loading)
    try {
        collect { emit(Resource.Success(it)) }
    } catch (e: Throwable) {
        emit(Resource.Error(e))
    }
}

质量保障

tasks.register<Copy>("copyComposeReport") {
    from("${buildDir}/compose-metrics")
    into(rootProject.file("compose-reports"))
}

发布与矩阵

总结

  1. Kotlin 的语言特性与 Jetpack 组件天然契合,支持清晰分层与响应式数据流。
  2. 多模块化可以提高团队协作效率,需配合统一的模型、依赖与质量体系。
  3. 持续关注 Compose、KMP 等生态演进,提前规划架构演进路线。

至此,10 篇 Android Kotlin 系列从基础到架构实践已全部完成,可根据项目需求挑选模块深入落地。


编辑文章
分享这篇文章:

上一篇
Android Kotlin 环境搭建与语法速览
下一篇
Android Kotlin 日志监控与可观测性